演算法雜項 快速判定素數 素數表

2021-07-08 14:19:13 字數 790 閱讀 8507

問題描述,如何快速判斷乙個數x是否為素數?

傳統思維:對於數n,從i=2,3,4,5…到 n-1 判斷 n能否被i整除,如果全部不能整除,則n是素數,只要有乙個能除盡,則n不是素數;事實上,為了壓縮迴圈次數,可將判斷範圍從2 ~ n-1改為2 ~ sqrt(n)

但是我們如果要列印乙個比較大的素數表呢?比如列印前2000000的素數,此時選用篩選法就顯得非常方便。

先看下篩選法思想:

演算法的執行過程是這樣的:

1)首先,拿當前最小的數(即2)作為因子,將後面所有可以被2整除的數去掉(因為它們肯定不是素數,參見圖中的第1行,去掉後面的4、6、8…,剩餘結果見第2行);

2)之後,取剩餘序列中第二小的數(即3)作為因子,將後面所有可以被3整除的數去掉(參見圖中的第2行,去掉後面的4、6、8…,剩餘結果見第3行);

3)如此繼續,直到所取得最小數大於sqrt(n)(圖中第4行為最後一次篩選,此時的因子為7,因為下乙個因子即為11大於sqrt(50));

4)剩餘的序列即為n以內的所有素數。

如下c++演算法(其實就是c語言)列印n<2000000的所有素數

#includeusing namespace std;

const int max=2000001;

bool isprime[max];

int prime[max/2];

int main()

演算法筆記之素數判定與素數表

素數表的獲取 素數篩法 注意事項 素數又稱為質數,是指除了1和本身之外,不能被其他數整除的數。對給定的正整數n,如果對任意的正整數a 1當n未接近到int型別範圍上界時,素數判定 如下 bool isprime int n return true 當n接近int型別範圍上界時會導致i i溢位,解決方...

素數判定演算法

1.素數判定問題 素數判定問題是乙個非常常見的問題,本文介紹了常用的幾種判定方法。2.原始演算法 素數的定義是,除了能被1和它本身整除而不能被其他任何數整除的數。根據素數定義 只需要用2到n 1去除n,如果都除不盡,則n是素數,否則,只要其中有乙個數能整除則n不是素數。bool is primer1...

關於素數表的製作以及利用素數表的快速素數判斷方法

第一次寫部落格,紀念我轉行2星期。昨天晚上刷codewar的題目,心血來潮想能不能用歐幾里得篩法重新做快速素數判斷方法呢?這個方法雖然說空間複雜度要遠遠高於試除法。voidgenerateprime intn loop for primelist index 0 primelist index pr...