Eratosthenes篩選法(C++版)
阿新 • • 發佈:2019-02-17
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; }