「篩法」是一種求素數的方法。是西元前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...