埃式篩法——求n之內素數

  素數篩法的關鍵就在一個「篩」字。算法從小到大枚舉全部數,對每個素數,篩去它的全部倍數,剩下的就都是素數了。ios

  例如:求1-15中的全部素數。算法

  一、  2是素數(惟一須要事先肯定的),所以篩去2的全部倍數,即四、六、八、十、十二、14;spa

  二、  3沒有被前面的步驟篩去,所以3是素數,篩去全部3的倍數,即6,9,12,15;blog

  三、  4已經在1中被篩去,所以4不是素數;ci

  四、 5沒有被前面的步驟篩去,所以5是素數,除去全部5的倍數,即10,15;io

  五、 6已經在1中被篩去,所以6不是素數;class

  六、 7沒有被前面的步驟篩去,所以7是素數,篩去全部7的倍數,即14;stream

  七、8已經在1中被篩去,所以8不是素數;im

  八、9已經在2中被篩去,所以9不是素數;di

  九、10已經在1中被篩去,所以10不是素數;

  十、11沒有被前面的步驟篩去,所以11是素數,篩去全部11的倍數,可是15內沒有;

  十一、12已經在1中被篩去,所以12不是素數;

  十二、13沒有被前面的步驟篩去,所以13是素數,篩去全部13倍數,可是15內沒有;

  1三、14已經在1中被篩去,所以14不是素數;

  1四、15已經在2中被篩去,所以15不是素數;

  至此,1-15內的全部素數已經所有獲得。

 

  

#include <iostream>
#include <cstdio>
using namespace std;
const int SIZE = 1e7;

int prime[SIZE];            // 第i個素數
bool is_prime[SIZE];    //true表示i是素數
 
int slove(int n)
{
    int p = 0;
    for(int i = 0; i <= n; i++)
        is_prime[i] = true;             //初始化
    is_prime[0] = is_prime[1] = false;      //0,1不是素數
    for(int i = 2; i <= n; i++)
    {
        if(is_prime[i])                //這裏比較巧妙, 我只是意會
        {
            prime[p++] = i;             //計算素數的個數,也記錄下了素數
            for(int j = 2 * i; j <= n; j += i)      // 除掉了i的倍數的數字
                is_prime[j] = false;
        }
    }
    return p;
}
 
int main()
{
    int n;
    while(cin >> n)
    {
        int res = slove(n);
        cout << res << endl;
        for(int i = 0; i < res; i++)
            cout << prime[i] << endl;
    }
}
相關文章
相關標籤/搜索