快速查找素数
时间限制:
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
AC代码:
#include<stdio.h> int a[2000001]; int main() { int i,j,n; for(i=2;i<=2000000;i++) { if(!a[i]) //未被标记 for(j=i+i;j<=2000000;j+=i) //素数的倍数不是素数 a[j]=1; //标记 } while(scanf("%d",&n),n) { printf("2"); for(i=3;i<=n;i++) if(!a[i]) printf(" %d",i); printf("\n"); } return 0; }
超时代码:
#include<stdio.h> #include<math.h> #define MAX 2000000 int a[MAX]; int main() { int i,j,p,n; while(scanf("%d",&n)!=EOF&&n) { for(i=2;i<=n;i++) a[i]=1;//将所有的数赋值为1,即全部都是素数 for(i=2;i<=sqrt(n);i++) { for(p=i+i;p<=n;p=p+i)///把素数的倍数都赋为0;如当i=2时,进入循环,p=4,p=6,8,10,12.。 a[p]=0; } for(i=2;i<=n;i++) { if(a[i]==1) printf("%d ",i);//输出素数 } printf("\n"); } return 0; }
//打表法,不就是筛选吗!!
-
给出一个正整数数N(N<=2000000)