素数筛
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; } } }