陣列-篩法求素數
阿新 • • 發佈:2018-11-20
題目描述:
篩法求素數,指的是每次將一個素數的所有的倍數去掉,如果當前的數沒有被比它小的數去掉過,那麼當前的數就是素數。
比如1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1不是素數。不用管。
2是素數,那麼2的所有的倍數要被去掉。
3是素數,那麼3的所有的倍數要被去掉。
4 被去掉了。不用管。
。。。
這樣做下去我們就可以篩選出所有的指定範圍內的素數了。
你的任務是求小於等於n的素數的個數count。
輸出格式:
對於每個詢問n輸出小於等於n的的素數的個數。
樣例輸入:
2 10 1000000
樣例輸出:
4 78498
解析程式碼:
使用兩個陣列,一個用來存放質數,一個用來存放素數的個數
#include<iostream> using namespace std; //T個詢問,每次詢問一個整數N,每次輸出前N個數中素數的個數。T<=1億 N<=1000000 int c[1000001]; //剛開始,所有數都標記為質數 int a[1000001]; //表示前N個數總共有多少個素數 int m=0; int main() { // for(int i=2;i<=1000000;i++) { if(c[i]==0) //if(!a[i]) for(int j=2*i;j<=1000000;j=j+i) c[j]=1; } for(int i=2;i<=1000000;i++) { if(c[i]==0) m++; a[i]=m; } int T; cin>>T; int n; for(int i=1;i<=T;i++) { cin>>n; cout<<a[n]<<"\n"; } return 0; }