#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;
}
筛选法——快速查找素数
最新推荐文章于 2022-03-31 15:43:26 发布
本文介绍了一种使用筛法寻找素数的C语言程序实现。通过定义一个布尔类型的数组来记录每个数字是否为素数,并利用埃拉托斯特尼筛法筛选出指定范围内的所有素数。文章详细展示了如何通过双重循环高效地筛选素数,并提供了完整的代码示例。
704

被折叠的 条评论
为什么被折叠?



