1. 程式人生 > >陣列-篩法求素數

陣列-篩法求素數

題目描述:

篩法求素數,指的是每次將一個素數的所有的倍數去掉,如果當前的數沒有被比它小的數去掉過,那麼當前的數就是素數。

比如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;
}