素数筛

1 O(n*logn) 同时生成素数表

const int maxn=30000+5;
const int maxm=1000000+5;
int prime[maxn],ptot;
bool isprime[maxn];
void marktable(int n){
    memset(isprime,0,sizeof(isprime));
    ptot=0;isprime[1]=1;
    for(int i=2;i<=n;i++){
        if(!isprime[i]) {
            prime[ptot++]=i;
            for(int j=i*i;j<=n;j+=i)
            isprime[j]=true;
        }
    }
    //for(int i=0;i<ptot;i++) cout<<prime[i]<<endl;
}

2 O(n)同时生成素数表

const int maxn=30000+5;
const int maxm=1000000+5;
int prime[maxn],ptot;
bool isprime[maxn];
void marktable(int n){
    memset(isprime,0,sizeof(isprime));
    ptot=0;isprime[1]=1;
    for(int i=2;i<=n;i++){
        if(!isprime[i]) prime[ptot++]=i;
        for(int j=0;j<ptot;j++){
            if(i*prime[j]>n) break;
            isprime[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    //for(int i=0;i<ptot;i++) cout<<prime[i]<<endl;
}

 3 只生成素数筛

const int maxn=30000+5;

int prime[maxn];
void marktable(int n){
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=n;i++){
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=n/i;j++){
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}
原文地址:https://www.cnblogs.com/033000-/p/10088598.html