1. 程式人生 > >Eratosthenes篩選法(C++版)

Eratosthenes篩選法(C++版)

Sieve of Eratosthenes

使用埃拉託斯特尼篩選法計算小於100000的素數。

埃拉託斯特尼篩選法是最為知名的產生素數的篩選法,適用於產生最小的N個素數。

該方法的唯一缺點是使用的儲存空間大,可以進一步改進。

另外,該演算法也不適用於計算某個範圍內的全部素數。

C++版使用的標誌是布林標誌,比起C語言版(用整數陣列作為標識太浪費空間;用位運算邏輯太複雜,易出錯),使用的空間上改進相當多,並且邏輯也十分簡單。

這是一個基礎程式,用到的時候可以拷貝修改加以利用。

程式如下:

/*
 * 篩選法計算小於100000的素數
 * 篩選法求最小的素數序列,原本是不朽的數學家們手工計算的方法,
 */

#include <iostream>
#include <cmath>

using namespace std;

const int MAXN = 100000;
bool sieveflag[MAXN+1] = {false, false, true};

void esieve(bool sflag[], int n)
{
    // 初始化
    for(int i=3; i<=n; i++) {
        sflag[i++] = true;
        sflag[i] = false;
    }

    // 篩選
    int max = sqrt(n);
    for(int i=3; i<=max; i++){
        if(sflag[i]) {
            for(int j=i+i; j <= n; j+=i)
                sflag[j] = false;
        }
    }

}

int main()
{
    esieve(sieveflag, MAXN);

    for(int i=2, num=0; i<=MAXN; i++){
        if(sieveflag[i]){
            ++num;
            cout << num << ":" << i <<endl;
        }
    }

    return 0;
}