204 計數質數

2021-10-11 03:42:30 字數 1131 閱讀 8199

題目

尋找[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*in的大小關係

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