素數篩法詳解:歐拉篩素數


當數據量很大時,我們不能一個一個去判斷每個數是否為素數,那么我們可以采用歐拉篩來做

由於埃氏篩會存在某個合數多次被篩的情況,所以

歐拉篩的核心思想就是:讓每個合數只被它的的最小質因子篩選一次,沒有重復

歐拉篩:時間復雜度為O(n),所以也稱為線性篩,但只能篩到1e8這么大

 1 const int maxn=100000005;
 2 int prime[maxn];//素數表 
 3 bool sf[maxn];//判斷是不是素數 
 4 //歐拉篩素數:
 5 void sushu(int n){
 6     int cnt=0;
 7     memset(sf,true,sizeof(sf));//開始全設為是素數 
 8     for(int i=2;i<=maxn;i++){//外層枚舉所有數 
 9         if(sf[i]) prime[++cnt]=i;//是質數加入質數表 
10         for(int j=1;j<=cnt;j++){//內層枚舉cnt以內的質數prime[j] 
11             if(i*prime[j]>maxn) break;//篩完結束 
12             sf[i*prime[j]]==false;//篩掉合數:置合數為false 
13             if(i%prime[j]==0) break;//重點:避免重復篩 
14         }
15     }
16     sf[0]=false;
17     sf[1]=false; 
18 } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM