日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

素数筛模板

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 素数筛模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在判定素數的問題中,隨著不斷學習,里面的拓展性也在不斷地增加。

問題:

判定一個數是否為素數:

想都不想的方法:

static boolean isprime(int value){for(int i=2;i<value;i++){if(value%i==0){return false;}}return true; }

暴力從開始判斷的方法。復雜度O(n)。當數據大于1e7左右基本就爆了。更別說多組輸入了

稍微思考數據組成

對于一個數n如果不是素數,一定有a*b=n(a<b);a<根號n,b>根號n,所以只要出現一定是成雙成對。所以你只要找到1個就能說明這個數不是素數。所以從開始遍歷到a是最省時的方法。因為a是log級。算法復雜度為O(logn)所以代碼為:

static boolean isprime(int value) {for(int i=2;i*i<value+1;i++){if(value%i==0){return false;}}return true; }

這種情況能夠基本單輸入的素數問題。但是遇到多個輸入肯定也會GG的。

埃拉托斯特尼(Eratosthenes)篩法

問題:多個輸入,問關于素數相關的問題。
如果用上述方法肯定爆。多組輸入的最好解決辦法是打表。至于打表,如果上述的打表nlogn打表的話會TLE,所以就要換一種思考方式。

埃氏篩的核心思想就是將素數的倍數確定為合數。對于一個從2開始連續數據,我們假設其中每一個都是素數。如果一個數為素數,那么這個數的倍數一定也是素數。所以算法大致流程:
2: [i=(2+2)—>(+2)數組尾],4,6,8,10 * * 不是素數
3: [i=(3+3)—>(+3)數組尾],6,9,12 * * 不是素數
4: [i=4]不是素數,跳過
5: . . . . . . . . . . . .
這個到除了前面幾次的計算量多一點,到后面隨著數據增大對整個復雜度相加是比較小的,算法復雜度為O(nloglogn);別小瞧多的這個logn,數據量大一個log可能少不少個0,那時間也是十倍百倍甚至更多的差距。
具體代碼為

static boolean isprime[]; static long prime[]; static void getprime(){prime=new long[100001];//記錄第幾個primeint index=0;isprime=new boolean [1000001];for(int i=2;i<1000001;i++){if(!isprime[i]){prime[index++]=i;}for(int j=i+i;j<1000000;j=j+i)//他的所有倍數都over{isprime[j]=true; }}}

歐拉篩——線性篩

對于上述的埃氏篩,雖然能解決大部分的問題。但是不難發現里面還是有挺多不夠精簡的地方,比如有的地方會重復訪問。而歐拉篩在埃氏篩的基礎上進行優化,達到O(n)的復雜度。

static boolean isprime[]; static int prime[]; static void getprimeoula()// 歐拉篩{prime = new int[100001];// 記錄第幾個primeint index = 0;isprime = new boolean[1000001];for (int i = 2; i < 1000001; i++) {if (!isprime[i]) {prime[index++] = i;}for (int j = 0; j < index && i * prime[j] <= 100000; j++){isprime[i * prime[j]] = true;// if (i % prime[j] == 0)break;}}}
  • 如果對后端、爬蟲、數據結構算法等感性趣歡迎關注我的個人公眾號交流:bigsai
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的素数筛模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。