快速查找素数
时间限制:
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
- 算法分析:打素数表;
- 错误原因:假如n=2000000时要考虑最后的数字
-
View Code
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define MAXN 2000001 using namespace std; int prime[MAXN],cnt; bool isprime[MAXN]; void getprime(int n)//得到1~n间的素数 { int i,j,k,m; m=sqrt(n)+1;cnt=0; memset(isprime,true,sizeof(isprime)); isprime[0]=isprime[1]=false; prime[cnt++]=2; for(i=4;i<=n;i+=2) isprime[i]=false; for(i=3;i<=m;i++) { if(isprime[i]) { prime[cnt++]=i; for(k=i+i,j=i*i;j<=n;j+=k) isprime[j]=false; } } for(;i<=n;i++) if(isprime[i]) prime[cnt++]=i; } int main() { int n,i; getprime(MAXN-1); while(scanf("%d",&n)&&n) { for(i=0;prime[i]<=n&&prime[i]!=0;i++)//最后一个素数后面全是0 { printf("%d ",prime[i]); } printf("\n"); } return 0; }