快速查找素数
时间限制: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
快速查找素数
这道题目考察的是素数的筛法,不过需要注意的点就是如何写筛法.下面的一种是超时的写法: 先用筛法求出规定的大小内的所有的素数,然后用二分法确定要输出的数的个数,但是超时了。
1 #include <iostream> 2 #include<stdio.h> 3 #include <cstring> 4 using namespace std; 5 6 const int MAXN = 2000000; 7 bool u[MAXN]; 8 int prime[MAXN], cnt = 0; 9 void primer(){ 10 memset(u, true, sizeof(u)); 11 for(int i=2; i<MAXN; ++i){ 12 if(u[i]) prime[cnt++] = i; 13 for(int j=0; j<cnt && i*prime[j]<MAXN; ++j){ 14 u[i*prime[j]] = false; 15 if(0 == i%prime[j]) break; 16 } 17 } 18 } 19 // 20 int getnum(int n){ 21 int left = 0,right = cnt-1; 22 int middle=(left+right)/2 ; 23 while(prime[middle]!=n&&right>=left ){ 24 if(n<prime[middle]) right = middle-1; 25 else left= middle+1; 26 middle = (left+right)/2; 27 } 28 return middle; 29 } 30 31 int main(){ 32 int n; primer(); 33 while(1){ 34 scanf("%d",&n); 35 if(n==0) break; 36 for(int i=0;i<getnum(n )+1;i++ ){ 37 printf("%d ",prime[i] ) ; 38 } 39 printf("\n"); 40 } 41 return 0; 42 }
下面曝一种其他同学的写法:也是筛法,但是比较单一,比较简单,但是却能AC。
1 #include<stdio.h> 2 3 int main(){ 4 int n,i,s,j; 5 bool a[2000005]={0}; 6 a[0]=1;a[1]=1; 7 8 //并没有考虑可能重复筛选的数字 9 for(i=2;i<2000001;i++){ 10 if(a[i]==0){ 11 for(j=i+i;j<=2000001;j=j+i) 12 a[j]=1; 13 } 14 } 15 16 while(scanf("%d",&n)!=EOF&&n!=0){ 17 s=0; 18 for(i=2;i<=n;i++){ 19 if(a[i]==0){ 20 s++; 21 if(s==1) printf("%d",i); 22 if(s>1) printf(" %d",i); 23 } 24 } 25 printf("\n"); 26 } 27 return 0; 28 }
时间: 2024-10-12 00:03:31