1913: 快速查找素数
时间限制: 4 Sec 内存限制: 64 MB
提交: 132 解决: 48
您该题的状态:已完成
[提交][状态][讨论版]
题目描述
现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
输入
给出一个正整数数N(N<=2000000) 但N为0时结束程序。 测试数据不超过100组
输出
将2~N范围内所有的素数输出。两个数之间用空格隔开
样例输入
<span style="color:#333333"><span style="color:black">5
10
11
0</span></span>
样例输出
<span style="color:#333333"><span style="color:black">2 3 5
2 3 5 7
2 3 5 7 11
</span></span>
提示
来源
这题用常规方法,绝对时间超限,用筛选法求素数,开了个2000000的数组,居然没有爆内存,哈哈,
还有用memset置不了一,这点很好奇。找到原因了,该函数对数组操作时只能用于数组的置0或-1,其他值无效。
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define N 2000000//N的大小可以根据需要变化
int a[N];//利用数组的下标记录要判断的数字
int main()
{
memset(a,0,sizeof(a));//对数组a进行初始化为0,不是素数的标记为1,剩下为0的就是素数了
a[1]=1;//1既不是素数也不是合数,先标记为0
for(int i=2; i<=sqrt(N); i++)
{
if(a[i]==0)//如果i是素数
{
for(int j=2; j*i<=N; j++) //循环标记的范围是i*j<N
{
a[i*j]=1;//如果i是素数,那么i*j肯定不是素数
}
}
}
int n,m,j,i;
while(~scanf("%d",&n),n)
{
for(i=2,j=0;i<=n;i++)
if(a[i]==0)
{
if(j==0)
cout<<i;
else
cout<<" "<<i;
j++;
}
cout<<endl;
}
return 0;
}