筛素法是一种较快求得小于N的所有素数的方法,用时很短。
实现
我们先用模拟的方式来求10000以内的所有素数:
for(i=2;i<10000;i++)
{
for(j=2;j<=i/2;j++)
{
if(i%j==0) //如果i可以被小于其的数j整除,则i必定不是素数
break;
}
if(j>i/2)
printf("%d ",i);
}
下面使用筛素法:
const int N=10001;
int p[N];
memset(p,0,sizeof(p)); //初始化全为0,1表示其不是素数
p[0]=p[1]=1;
for(i=2;i<N;i++)
{
if(!p[i]) //如果i目前的p[i]不是0,即i是素数
{
for(j=i+i;j<N;j+=i) //则i的所有倍数,必定均不是素数,故将其的倍数全标记为1
p[j]=1;
}
}
for(i=0;i<N;i++) //打印素数,0表示其为素数
{
if(!p[i])
printf("%d ",i);
}
相较于模拟的方法,筛素法的时间复杂度从O(n*n)接近了O(n)。