算法:
s0:定义数组并赋值,2是素数(计数、输出)
s1:把2的倍数删掉;
s2:2之后剩下的第一个数字是素数,这个数字是3(计数、输出);
s3:把3的倍数删掉;
s4:3之后剩下的第一个数字是素数,这个数字是5(计数、输出);
s5:把5的倍数删掉;
……(类推省略)
C语言实现:
#include <stdio.h>
int a[100000000];//在主函数外定义全局变量数值上限高,自行修改到3、4亿也行,主函数里可定义不到这么大
int main()
{
int n,i,k,v=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
a[i]=i+1;
}
for(i=1;i<n;i++)
{
if(a[i]!=0)//晒过后的第一个非零值一定是素数
{
for(k=2;k*(i+1)<=n;k++)
{
a[k*(i+1)-1]=0;//将a[i]的整数倍筛掉
}
//printf("%d、",a[i]);打印太慢,这里屏蔽了
v++;
}
}
printf("共%d个素数\n",v);
return 0;
}