要求: 筛法构造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>
互相学习,共同进步,如果觉得有不妥的地方还望指出来,小生刚出道。
如果觉得还可以,可否给小弟第一下,以表示估计,感激不尽。
你的鼓励将是我莫大的前进动力。