快速查找素数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数。
同一道题,虽然用同一种方法,但是,效率还是有差别的....
试除法。。。(1)
也是我们最常用的。。。来打表(素数表)
代码:
#include<stdio.h> #define maxn 150000 int arr[maxn]={2,3,5,7,11}; int main() { int n,i,j,k=5; for(i=13;i<=1999993;i++) { for(j=2;j*j<=i;j++) { if(i%j==0) break; } if(j*j>i) arr[k++]=i; } while(scanf("%d",&n),n) { for(i=0;arr[i]<=n&&arr[i]!=0;i++) { if(i==0) printf("%d",arr[i]); else printf(" %d",arr[i]); } printf("\n"); } return 0; }
效率不是非常的高.....
有一种比较快的方法,打表。
模板为:
int prime[200000]; bool bo[10000001]; int prime_table() { int i,j,flag=0; memset(bo,0,sizeof bo); bo[0]=bo[1]=1; for(i=2;i<=1000;i++) { if(!bo[i]) { for(j=i*i;j<=len;j+=i) bo[j]=1; } } for(i=0;i<=len;i++) if(!bo[i]) prime[flag++]=i; return flag //在该范围内的个数.... }
代码:
#include<stdio.h> #define maxn 150000 #define len 1999993 int prime[maxn]; //存储素数 bool isprime[len+1]={1,1}; //用来判断是否为素数,1代表不是,0代表是 void prime_table() { int i,j,flag=0; for(i=2;i*i<=len;i++) //对于在给定的范围内,就是打表的范围内 { if(!isprime[i]) { for(j=i*i;j<=len;j+=i) isprime[j]=1; } } for(i=0;i<=len;i++) if(!isprime[i]) prime[flag++]=i; } int main() { int n,i; prime_table(); while(scanf("%d",&n),n) { printf("%d",prime[0]); for(i=1;prime[i]<=n&&prime[i]!=0;i++) printf(" %d",prime[i]); printf("\n"); } return 0; }