1. 程式人生 > >篩素數

篩素數

nbsp code color 素數篩 max 最小 素數 prim col

普通篩

const int MAXN = 50000void 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] } } }

篩素數