篩素數
阿新 • • 發佈:2017-05-23
nbsp code color 素數篩 max 最小 素數 prim col
普通篩
const int MAXN = 50000; void Prime() // 素數表p[i]=1為素數 { int i, j; for (i=0; i<MAXN; i++) prime[i] = 1; prime[0] = prime[1] = 0; for (i=2; i<MAXN; i++) { if (!prime[i]) continue; for (j=i*2; j<MAXN; j+=i) prime[ j ] = 0; //將每個素數的倍數都刪去(有重復)} }
線性篩
每個合數除1外最小的因數一定是素數,只利用這個素數篩沒有重復
int prim[50000],prime_n; bool is_pr[500000]={1,1}; void prime(){ int m=500000; for(int i=2;i<m;i++){ if(!is_pr[i])prim[prime_n++]=i;//沒有篩掉的為素數 for(int j=0;j<prime_n&&i*prim[j]<m;j++){ is_pr[prim[j]*i]=1;//篩掉 if(i%prim[j]==0)break;//後面的數最小因數一定小於等於prim[j] } } }
篩素數