筛素法

筛素法是一种较快求得小于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)。


猜你喜欢

转载自blog.csdn.net/jinixin/article/details/70214932