1.判斷數n是否是素數
素數即質數,是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。反之則為合數。1既不是素數也不是合數。
那麼根據定義,即可判斷乙個整數n是否為素數:
bool
isprime
(int n)
這樣的時間複雜度為o(n),我們考慮可不可以繼續化簡。
考慮質數的性質:
公理:合數n的最小因子一定<=sqrt(n)則**可以改寫為:證明:a,b為n的兩個因子,即ab=n。其中a為n的最小因子,則b>=a,若n的最小因子a大於sqrt(n),則b同樣大於sqrt(n),這樣ab>n,與假設相反,所以合數n的最小因子一定<=sqrt(n)。
bool
isprime
(int n)
時間複雜度為o(sqrt(n))
2.計算小於n的所有素數
對於檢測乙個數是否是素數這樣已經很完美了,但是計算小於n的所有素數這類題目,有一種更加巧妙的方法:erastothenes篩。
原理:合數一定是小於其的質數的整數倍,那麼如果把質數(最初只知道2是質數)的倍數都去掉(也就是與2有關的合數),那麼剩下的就是質數了。證明:這種方法顯然不會將質數標記成合數;另一方面,當從小到大遍歷到數 x時,倘若它是合數,則它一定是某個小於 x的質數 y的整數倍,
也就是說,該方法一定不會存在錯將質數認為合數的情況,因為我們一直在篩選質數的整數倍,意思就是篩去的一定是合數。那會不會存在漏檢現象呢,答案也是不會。因為合數一定是小於其的某乙個質數的整數倍,而我們就是從小到大走過來的,將每乙個質數的整數倍都篩去了,不可能漏檢。
所以,我們可以先找到第乙個素數(2),這樣2的整數倍一定不是素數,將其篩去。需要注意的是比如素數3,我們應當從33開始篩,因為32已經被篩過了。
class
solution
}//if
}//for
int result =0;
for(
int i=
2; i)//for
return result;}}
;
素數相關習題
素數定義 質數又稱素數。乙個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數 否則稱為合數 規定1既不是質數也不是合數 判斷乙個數n是不是素數,最簡單的方法就是直接遍歷,看看從2到n 1是否能夠整除n。如下 bool isprime int n return true 因為如果能找...
關於最大素數
這些天很無聊的了解了一下幾個數學題 由對王垠的40行 引發,先是研究了尾遞迴,後又由於王垠的文章 談p np?了解了一下當今數學的七大難題,於是又去查其中乙個龐加萊猜想的事情 龐加萊猜想已經解決,後有丘成桐事件 另外哥德 猜想的相關事情 陳景潤的1 2,非七大難題 最後又回到p np問題 七大難題之...
關於質數(素數)
素數的演算法 最基礎的演算法 n int input for i in range 2,n if n i 0 print n,可以被 i,整除 break else print n,是乙個質數 改進演算法,通過開方縮小整除範圍 n int input for i in range 2,int n 0...