您的位置:首页 > 其它

质数筛选(详细解释以及模板)(Eratosthenes)

2016-01-31 00:36 323 查看
要求: 筛法构造1-n的素数表

筛法的思想特别简单,对于不超过n的每个非负整数p,删除2p,3p,4p.......,

当处理完所有数之后,还没有被删除的就是素数。如果用p[i]表示i已经被删除,代码可以这样写

<span style="font-size:24px;">const int maxn=10000;
int p[maxn];  //使用质数筛法 
void prime() //没有优化 
{
	memset(p,0,sizeof(p));
	for(int i=1;i<=n;i++)
	  for(int j=2*i;j<=n;j+=i)
	     p[i]=1;
}</span>


以上代码时间复杂度O(nlongn) ,尽管时间复杂度已经很高效了,还是可以改进。

下面这份代码主要用于改进,首先,对于不超过n的每个非负整数p,p可以限定为素数。只需要在第二重循环前加 if(!p[i])即可

另外,内循环也不必从i*2开始--塔已经在i=2被筛选掉了,改进后代码如下。

<span style="font-size:24px;">void prime_1()  //优化。 
{
    memset(p,0,sizeof(p));
    p[1]=1;  //1不是质数 
	int m=sqrt(maxn+0.5);  
	for(int i=2;i<=m;i++)  //1-maxn 质数筛选 
	{
	   if(!p[i])  //如果p[i]=1;表示i以及i的倍数已经被筛选掉了
	   for(int j=i*i;j<=maxn;j+=i)
	       p[j]=1;
	}	
} </span>


互相学习,共同进步,如果觉得有不妥的地方还望指出来,小生刚出道。

如果觉得还可以,可否给小弟第一下,以表示估计,感激不尽。

你的鼓励将是我莫大的前进动力。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: