the gif is from DEVEN BHOOSHAN-MIRAGE
const int MAX=2000;
int prim[MAX]; //保存素数
int fla[MAX]; //记录是否为素数
int prime(){
memset(fla,1,sizeof(fla));
for(int i=2;i<MAX;i++)
if(fla[i]){ //如果i是素数,那么与它的整数倍的数都不是素数
for(int j=i*2;j<MAX;j+=i){
fla[j]=0;
}
}
int k=0;
for(int i=1;i<MAX;i++){ //保存素数表
if(fla[i])
prim[k++]=i;
}
return k;
}
//代码中忽略考虑1,1不是素数,最小的素数是2
//prim[MAX]中从prim[1]开始为素数表
补充
代码优化:
int prim[MAX],fla[MAX],cnt=0;
int prime(){
memset(fla, 1, sizeof(fla));
fla[0]=false; //将0,1排除在素数范围外
fla[1]=false;
for (int i=2;i<MAX;i++)
if (fla[i]){
prim[++cnt]=i;
for (int k=i*i;k<MAX;k+=i) //由之前的i*2改为i*i
fla[k]=false;
}
return cnt;
}
快速线性筛法
之前的方法会造成重复筛除合数,影响效率。比如6,在i=2的时候,k=2*3筛了一次;在i=3,k=3*2 的时候又筛了一次。所以,也就有了快速线性筛法。
int isNotPrime[N] = {1, 1};
int prim[N] = {0},num_prime = 0;
int prime(){
for(int i = 2 ; i < N ; i ++)
{
if(! isNotPrime[i])
prim[num_prime++]=i;
for(long j = 0 ; j < num_prime && i * prim[j] < N ; j ++)
{
isNotPrime[i * prim[j]] = 1;
if( !(i % prim[j] ) )
break;
}
}
return num_prime;
}
ref:Dinosoft