題目
尋找[2,n]的質數是很常見的問題,主要有三種方法,現總結如下:
列舉法思路簡單,但是要注意這幾點:
1、0和1應該要特判,除非在判斷質數時壓根就不讓0,1參與選擇,直接從2開始
2、為了判斷n是否是質數,只需要列舉i=2至i=根號n,但是在程式中應該表現為i*i <= n
,素數條件如果從i*i<=x改為i<=sqrt(x)就過不了,因為sqrt函式執行速度很慢
class
solution
bool
isprime
(int n)
};
埃氏篩的原理是,如果i是乙個質數,那麼i的整數倍一定是合數,我們使用乙個陣列來表示[2,n]
質合數情況,逐個篩查。但是需要注意的是:
1、i*i
可能會越過int的界,但是n一定是int,因此我們要在進入篩查之前就判斷i*i
和n
的大小關係
runtime error: signed integer overflow: 46349 * 46349 cannot be represented in type 'int' (solution.cpp)
2、我們在標記質數時,不能夠每次都從2*i
開始標記,這樣會浪費時間,造成冗餘。因為這些合數在之前就已經標記過了,我們只需要從i*i
開始標記即可。
class
solution
}return num;}}
;
線性篩在埃氏篩的基礎上更進一步,對於埃氏篩來說,45將被3和5標記兩次,造成冗餘。線性篩的思路是,將標記出來的質數儲存在乙個陣列中,然後用[2,n]每個數去乘所有的質數,所得的積一定是合數。(注意不要越界)
class
solution
for(
int j =
0;j < prime.
size()
&&i*prime[j]
< n;j++)}
return prime.
size()
;}};
204 計數質數
統計所有小於非負整數 n 的質數的數量。示例 輸入 10 輸出 4 解釋 小於 10 的質數一共有 4 個,它們是 2,3,5,7 這個題目思路很簡單,但是可能效率不高,裡面有一些小trick需要注意,所以在這裡記錄一下優化過程。思路1 逐個判斷每個數是否質數,超時 class solution d...
204 計數質數
統計所有小於非負整數 n 的質數的數量。示例 輸入 10 輸出 4 解釋 小於 10 的質數一共有 4 個,它們是 2,3,5,7 判斷質數的常規解法 如判斷n是否為質數,只需要判斷n是否能整除2 int sqrt n 厄拉多塞篩法 比如說求20以內質數的個數,首先0,1不是質數.2是第乙個質數,然...
204 計數質數
統計所有小於非負整數 n 的質數的數量。示例 輸入 10 輸出 4 解釋 小於 10 的質數一共有 4 個,它們是 2,3,5,7 埃拉託色尼篩選法,迴圈中置對應值的倍數為0,最後統計為1的個數,也就是質數的個數。class solution def countprimes self,n int i...