利用Eratosthenes篩選法計算質數

2021-08-19 19:01:31 字數 1108 閱讀 8177

演算法第1步就是寫下從3至某個上限之間的所有奇數。在演算法的剩餘部分,遍歷整個列表並剔除所有不是質數的奇數。在3之後把每逢第3個數(3的倍數)剔除。完成這一步之後,輪到5,將所有5的倍數剔除。這樣依次類推、反覆進行,最後列表中未被剔除的數均為質數。

這裡可能讀者會有問題了,為什麼輪到4、6、8、10等等之類的數字呢?原因在於,我們待篩選的列表中的所有數字都是奇數。一開始就直接從奇數空間尋找質數(偶數除

2之外都不是質數)

,那麼用4、6、8、10之類的數字作為標準參與剔除過程是不必要的,奇數和這類數字肯定沒有公約數。自然篩選完成之後是

沒有發生改變

的。這樣可能還是比較抽象,我將用一張示意圖進行說明:

紅色標記代表已經被剔除

每個陣列元素的值用於標記對應的數是否已被剔除。開始時所有元素的值都設定為true(

值為1),當演算法要求「

剔除」其對應的數字時,就把這個元素設定為false(

值為0)。

以上處理都完成了之後,準備輸出列表中的數字,

注意,列表只是乙個邏輯概念,並不真實存在

,所以用本演算法會使得程式的空間效率大大提高。並不是列表中的任意數字都能輸出的,

只有該數字對應的陣列元素的值為true是才能夠輸出

。我們回顧一下傳統的找尋質數的辦法,最大的缺陷就是把所有待篩選的數字都放在陣列裡面,並沒有充分利用下標,大大浪費了空間。

本程式在vs2017下執行通過,環境不同可能會造成困擾。

Eratosthenes篩法(素數篩)

最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,然後剩下的就是素數,複雜度o nlogn 因為對內層迴圈n 2 n 3 n n 小於 1 1 2 1 3 1 n ln n 1 其中 為尤拉常數 0.577218 應當注意,1不是素數哦 這樣已經不慢,但由於所有非素...

Eratosthenes篩法求素數

篩法的思想 對於不超過n的每個非負整數p,刪除2p,3p,4p,5p,當處理完所有數之後,還沒有被刪除的數就是素數 這是簡易版的篩法,也最好理解 for int i 2 i n i for int j i 2 j n j i vis j false 還可以繼續改進,為什麼呢?給定外層迴圈變數i,內層...

Eratosthenes篩法的F 實現

什麼是eratosthenes篩法 考慮乙個常見的數論問題,指定乙個整數,求出不大於該數的所有質數。我們可以先寫乙個函式來判斷某個整數是否為質數,然後用它逐一判斷每個整數,而eratosthenes篩法比這種方法高效得多。下面舉例來說明它的原理。觀察下面的彩圖 來自wikipedia 這裡是檢查12...