nyoj 187 快速查詢素數
阿新 • • 發佈:2018-12-23
快速查詢素數
時間限制:1000 ms | 記憶體限制:65535 KB
難度:3
輸入
給出一個正整數數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,要你快速的找出在2.....N這些數裡面所有的素數。
本以為一個簡簡單單的篩法求素數就能過的,交了7,8遍還是TLE,人生究竟是為了什麼。。。然後百度了一下,發現這個篩選法還可以優化,頓時恍然大悟。。果然還是我太菜了。。。
程式碼如下:
#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> #include <cmath> using namespace std; int a[2000015]; int prime[2000015]; int num=0; void is_su() { int m=sqrt(double(2000000+0.5)); for (int i=2;i<=m;i++) { if(a[i]==0) { prime[num++]=i; for (int j=i*i;j<=2000000;j+=i) a[j]=1; } } for (int i=prime[num-1]+1;i<=2000000;i++) if(!a[i]) prime[num++]=i; } int main() { int n; for (int i=0;i<2000015;i++) a[i]=0; //for迴圈初始化比memset快。。。 //memset (a,0,sizeof(a)); is_su(); while (scanf("%d",&n)!=EOF&&n) { for (int i=0;i<num;i++) { if(prime[i]>n) break; else printf("%d ",prime[i]); } printf("\n"); } return 0; }
然後篩選出來還需要用一個數組來儲存素數。 。 不然挨個遍歷會超時的。 。。