習題 關於素數

2021-10-22 19:04:00 字數 1269 閱讀 3735

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...