#include<stdio.h>
#define MAX 2000000
bool vis[MAX]; //利用bool型数组,false表示不是素数,true表示素数
void is_prime() //将一定范围内的素数判断结果全部存到数组里
{
int i,j;
vis[1]=false; //1不是素数,先标记好
for(i=2;i<=MAX;i++) //利用for循环给bool数组初始化为true应该比memset快
vis[i]=true;
for(i=2;i*i<=MAX;i++) //从2开始判断,i*i可以优化一些步骤,减少一些时间
{
if(vis[i]==false) //如果这个数已经别标记过不是素数,直接跳过
continue;
for(j=i*i;j<=MAX;j+=i) //开始筛选,把里面是一些素数的倍数全都标记出来为false,i*i可以优化一些步骤
vis[j]=false;
}
}
int main()
{
is_prime(); //记得在主函数内调用
int n,i;
while(scanf("%d",&n)!=EOF&&n!=0) //这个是顺应NYOJ上的一道题,多组数据,输入0结束
{
for(i=2;i<=n;i++) //进行输出
{
if(vis[i]==true) //如果被标记为true,就输出
printf("%d ",i);
}
printf("\n");
}
return 0;
}
筛选法——快速查找素数
最新推荐文章于 2020-07-14 21:35:14 发布