例如我求15以内的素数,那么埃拉托色尼筛法运行的原理是这样的:
n=15;
2 3 4 5 6 7 8 9 10 11 12 13 14 15
全部标记 1 1 1 1 1 1 1 1 1 1 1 1 1 1
第一次筛 1 1 0 1 0 1 0 1 0 1 0 1 0 1
第二次筛 1 1 0 1 0 1 0 0 0 1 0 1 0 0
运行完可以发现2到15中剩下被标记为1的都为素数,非素数都被标记为0.所以最后输出标记为1的即可得到n区间内所有素数。可以把例子带入下列代码中配合图解逐步验证方便理解。
#include<stdio.h>//需要引入的文件
#include<math.h>
//如解答错误,注意检查错误信息提示,对比预期输出和实际输出之间的差异
int main() {
int a[101];
int i,j;
int n=100;
for(i=1;i<=n;i++)
{
a[i]=1; //把n以内所有数都标记为1,如上面的图解,即先假定他们都是素数。
}
for(i=2;i<=sqrt(n);i++)//i最多等于sqrt(n),因为范围要在(2,n)内。
{
if(a[i] == 1)
{
for(j=i;j*i<=n;j++) //j直接令为i是因为j之前的倍数都标记过了,例如i=4时,4的2倍与4的3倍在之前都被标记过了,因为在i=2时,会算到2的4倍,i=3时计算过了3的4倍,所以可以直接从4的4倍开始,接着4的5倍数,,,,
{
a[i*j]=0; //把素数的倍数都标记为0.
}
}
}
for(i=2;i<=n;i++)
{
if(a[i] == 1) //非素数都被标记为0;剩下的标记为1的就全是素数了。
{
printf("%d ",i);
}
}
return 0;
}