C語言學習筆記 素數篩法

2021-10-24 13:21:44 字數 1813 閱讀 9948

「篩法」是一種求素數的方法。是西元前300年左右由古希臘著名數學家埃拉託色尼提出的,埃拉託色尼把自然數1、2、3、4、……寫在一塊塗了一層白蠟的板上,將去掉數的地方用工具刺成小孔,很像乙個篩子。因為用它把所有的合數都篩掉,留下的都是質數,所以,人們把這種求質數的方法叫做「篩法」。

用篩法求素數的基本思想是:把從1開始的、某一範圍內的正整數從小到大順序排列, 1不是素數,首先把它篩掉。剩下的數中選擇最小的數是素數,然後去掉它的倍數。依次類推,直到篩子為空時結束。

那「篩法」如何在c語言實現呢?

現在給你乙個正整數n,要你快速的找出在2.....n這些數裡面所有的素數。

輸入 給出乙個正整數數n(n<=2000000)

輸出 將2~n範圍內所有的素數輸出。兩個數之間用空格隔開

下面我們使用篩法來求解這道題:

埃拉託色尼把自然數1、2、3、4、……寫在一塊塗了一層白蠟的板上,而我們可以建立乙個陣列來模擬這一行為:

宣告乙個長度為n+1的布林陣列a[n+1]。用這個陣列來表示對應下標的數字是不是素數,而陣列內每個對應的值則代表小孔。

起初,將陣列所有成員標記為1,然後按照某種方法將其中的非素數都標記為0,這樣下來咱們的「板子」就建立好了

#include

#include

//素數判斷函式使用

#include

int*a =

null

;int n =0;

intmain()

/*此處放素數判斷函式*/

free

(a);

return0;

}

完成後的陣列有這樣的特徵:所有素數為下標的成員記憶體的數字都是1,所有非素數為下標的成員記憶體的數字都是0。

接下來就是「點小孔」了:

判斷一i是否為素數,最簡單的方法是用迴圈判斷每個小於i的整數能否整除i:

int

judge()

}}return0;

}

若使用篩法判斷,當我們判斷出是素數後,將此素數的倍數都變為非素數:

int

prime_judge()

}return0;

}

當然這個方法已經有很大的改進了,但是仍然存在會有重複篩掉某一合數,增加無用計算的現象,例如,刪3的倍數時15標記為0,刪15的倍數時,同樣再一次將15標記為0。這還不夠精簡,因此有人將這個方法進行了改進:

int

prime_judge()

for(

int i =

2; i <=

sqrt

(n); i++)}

return0;

}

最後是總體**:

#include

#include

#include

#include

int*a =

null

;int n =0;

intmain()

prime_judge()

;prime_view()

;free

(a);

return0;

}int

prime_judge()

for(

int i =

2; i <=

sqrt

(n); i++)}

return0;

}int

prime_view()

}return0;

}

C語言素數篩法

埃氏篩法 樸素篩法及其優化 與尤拉篩 線性篩法 略解 2018.08.09 oi學習oi演算法數論 在之前我們學過的最樸素的篩法就是埃氏篩法 埃拉託斯特尼篩法 它的複雜度是 theta n log 2 n nlog2 n 其實這個樸素的篩法可以進行常數上的優化。還有一種更炫酷的篩法 尤拉篩,即線性篩...

C語言 篩法求100以內的素數

步驟簡介 輸出陣列中餘下的a i 0的數 我的 include include include intmain 做篩法的準備 求出對應的開方數,新得遍歷倍數 edge int sqrt n for i 2 i edge i 輸出所有的不為零的部分 for i 0 i n i return0 教程 i...

《C演算法》讀書筆記 (3) 素數篩法

原程式在處理邊界上有誤,做了一定修改 void eratosthenesprime 該演算法的複雜度是f n n 2 n 3 n 5 n n n 為了檢驗演算法複雜度,引入了count計數值,並且與線性篩法做了對比 include include include include include us...