當數據量很大時,我們不能一個一個去判斷每個數是否為素數,那么我們可以采用歐拉篩來做
由於埃氏篩會存在某個合數多次被篩的情況,所以
歐拉篩的核心思想就是:讓每個合數只被它的的最小質因子篩選一次,沒有重復
歐拉篩:時間復雜度為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 }