素數(prime number)又稱質數,有無限個。問法1:給定乙個數n,判斷n是不是素數素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。
一、暴力列舉
列舉2~n-1
分別當做除數,判斷是否能整除,如果某個數能把n
整除,那麼就說明n
不是素數,如果所有都不能整除,那麼n
就是素數。
注:n=1或n=2時需要特判
詳見**:
bool
work
(int n)
return
true
;}
然而這樣會很慢…
二、優化過的暴力演算法
由於n至少會有乙個約數在sqrt(n)中,所以我們可以直接列舉從2~sqrt(n),這樣便會快不少。
詳見**:
bool
work
(int n)
return
true
;}
以上所說的演算法只是用來判斷單個素數的,但是若是要求1~n之間的素數該怎麼辦呢?
還是暴力?
不!要用到乙個名叫「篩法」的東東
三、埃氏篩法
由於我們知道,2的任何倍數都不可能是素數,3的任何倍數不可能是素數,5的任何倍數不可能是素數…
所以我們可以把素數的倍數全部篩掉。
詳見**:
/*
vis用來判斷有沒有被篩掉,
prime用來儲存素數
cnt代表素數總數
*/for
(int i=
2;i<=n;i++
)}
但是以12為例
12是2的倍數,被篩
12是3的倍數,被篩++
所以事實證明會有一些數被篩好多次
那要怎麼做到每個數隻篩一次的線性複雜度呢?
四、線性篩
線性篩,又稱尤拉篩
尤拉篩法的基本思想 :在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。
/*
vis用來判斷有沒有被篩掉,
prime用來儲存素數
cnt代表素數總數
*/for
(int i=
2;i<=n;i++
)}
以上就是素數判斷及篩法的總結,謝謝**
參考文獻資料:
最後打個小廣告:
hulean.tk
素數判斷及篩法
單個素數判斷 素數判斷 小資料 int prime int n miller rabin 大素數判定 單個數字n複雜度15 log n int mr 30 此陣列為測試用的a,這12個可測所有的long long int lli miller rabin lli n if x 1 return fa...
數論 多種素數判斷法及素數篩法
水了一篇啊.眾所周知,大於等於 2 的僅含有 1 和自身這兩個因子的正整數被稱作素數 故只要判斷在 2,n 1 範圍內是否存在其它因子,就可以判斷 n 是否為素數了 無腦判斷法直接從 2 for到 n 1 稍微優化下可以縮減到 2,frac n 2 但這個方法時間複雜度為 o n 可以發現,如果某個...
素數判斷(篩法)
最簡單寫法 int isprime int n for int i 2 i n i return1 初步優化 乙個數的因數是成對出現的,其中乙個因數在開方後的前面乙個在開方後的後面,所以只需判斷它前面的數就可以了,如果前面都沒有,那麼它後面更不會有.這樣就可以減少迴圈次數.int isprime i...