数论模块的一道基础题,考察的就是筛选法——快速查找素数,在nyoj上已经通不过了,可能OJ内部出现了问题,一直显示超时,可以在XYOJ:http://xyoj.xynu.edu.cn/problem.php?id=1913 或者:http://115.159.40.116/ 提交,只要是筛选法都可以A。
下面我给出nyoj上的题目介绍吧。
快速查找素数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
- 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
-
输入
-
给出一个正整数数N(N<=2000000)
但N为0时结束程序。
测试数据不超过100组
输出
-
将2~N范围内所有的素数输出。两个数之间用空格隔开
样例输入
-
5 10 11 0
样例输出
-
2 3 5 2 3 5 7 2 3 5 7 11
#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;
}