1.基本筛法
#define N 16777220 bool prime[N]; void doprime1(){ int m, n, t; memset(prime, 1, sizeof(prime)); int e =(int)sqrt(float(N)); prime[0] = prime [1] = false; for(int i=4; i<=N; i+=2) prime[i]=false; for(int i=3; i<=e; i+=2) if(prime[i]) for(int j=i+i; j<=N; j+=i) prime[j]=false; }2.埃拉托色尼筛法
#define N 16777220 bool isprime[N]; int prime[N], nprime; void doprime(){ nprime = 0; memset(isprime, true, sizeof(isprime)); isprime[1]=false; for(int i=2; i<N; i++) if(isprime[i]) { prime[++nprime]=i; for(int j=i*i; j<N; j+=i) isprime[j]=false; }3.6N+1、6N-1法 只有形如6N+1或6N-1的自然数才有可能是素数 在程序上,外循环i按3的倍数递增,内循环j按照0~1的循环,则2(i+j)-1恰好就是形如6N+1或6N-1的自然数
int prime[N], k=0; bool Isprime(int x) { if(k==2) return true; if(k%2 == 0) return false; for(int i=3; i*i<=k; i+=2) if(!(k%i)) return false; return true; } void doprime() { for(int i=1; i<=N; i+=3) for(int j=0; j<2; j++) if(Isprime(2*(i+j)-1) prime[k++]=2*(i+j)-1; }