這學期的離散數學課程學了一點初等數論,其中的埃氏篩法當時課上沒有太懂,課後看了《挑戰程式設計競賽》一書終於弄懂了。(這本書確實很好!演算法簡潔優美。)
如果只對乙個整數進行素性測試,通常o(√n )的演算法就足夠了。但如果要對許多整數進行素性測試,則有更為高效的演算法,其中就包括埃拉託斯特尼篩法,簡稱埃氏篩法。它是乙個與輾轉相除法一樣古老的演算法,可以用於列舉n以內的素數。
首先,我們將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數都劃去。依此類推,如果表中剩餘的最小數字是m時,m就是素數。然後將表中所有m的倍數都化去。像這樣反覆操作,就能依次列舉n以內的素數。
如圖所示,最終我們就能得到20以內的所有素數。埃氏篩法的複雜度僅有o(nlognlogn)。對於程式設計競賽中的資料規模,將它的複雜度看作大致線性的也無妨。下面給出**:
1 #include 2 #include 3using
namespace
std;45
//埃氏篩法67
const
int max_n = 10005;8
int prime[max_n]; //
第i個素數
9bool is_prime[max_n+1]; //
is_prime[i]為true時表示i是素數
1011
//返回n以內素數的個數
12int sieve(int
n)21}22
return
p;23}24
2526
intmain()
2736
37return0;
38 }
數論基礎 埃氏篩法 區間篩法(模板)
區間篩法 求n之前的所有素數 原理1.如果採用利用文章中第乙個o sqrt n 的演算法,進行n次迴圈即可得到答案。顯然,這樣o nsqrt n 肯定超時,所以我們需要進行優化。2.如果我們判斷出a是素數,那麼我們就可以確定a的倍數都是合數。因此可以將這些倍數刪除,這樣就可以去掉一些不必要的判斷。3...
埃氏篩法 素數篩
埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...
素數 埃氏篩法
題目 求2 100以內的素數。素數 prime number 又稱質數,是指乙個大於1的自然數,除了1和它本身外,不能被整除以其他自然數。解法一 根據素數的定義,即用該數除比其小的數 1除外 都不能除盡,即為素數 public class prime if i n system.out.print ...