nyoj---快速查詢素數
阿新 • • 發佈:2022-05-05
快速查詢素數
時間限制: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<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; }