統計所有小於非負整數 n 的質數的數量。
示例:輸入: 10
輸出: 4
解釋: 小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
判斷質數的常規解法:如判斷n是否為質數,只需要判斷n是否能整除2~int(sqrt(n)),
厄拉多塞篩法
比如說求20以內質數的個數,首先0,1不是質數.2是第乙個質數,然後把20以內所有2的倍數劃去.2後面緊跟的數即為下乙個質數3,然後把3所有的倍數劃去.3後面緊跟的數即為下乙個質數5,再把5所有的倍數劃去.以此類推.
class
solution
:def
countprimes
(self, n:
int)
->
int:
if n<=2:
return
0# 生成乙個n維列表
isprime =[1
]* n
# 0和1不是質數,所以前兩個位置為0
isprime[0]
= isprime[1]
=0# 此時從index=2開始遍歷,isprime[2]=0,表明第乙個質數為2,
#然後將2的倍數對應的索引全部賦0,以此類推,剩下的索引對應的書就是質數
# 這裡沒有用(2, n), 因為求n以內的質數,只要將sqrt(n)+1以內質數的倍數全部刪掉,
# 剩下的就全是質數
for i in
range(2
,int
(n**
0.5)+1
):if isprime[i]==1
:# 在劃去的時候從i*i開始劃去,比i*i小的比如i*(i-1)在計算(i-1)的時候就已經劃掉了
isprime[i*i:n:i]=[
0]*len
(isprime[i*i:n:i]
)return
sum(isprime)
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 埃拉託色尼篩選法,迴圈中置對應值的倍數為0,最後統計為1的個數,也就是質數的個數。class solution def countprimes self,n int i...
204 計數質數
題目 尋找 2,n 的質數是很常見的問題,主要有三種方法,現總結如下 列舉法思路簡單,但是要注意這幾點 1 0和1應該要特判,除非在判斷質數時壓根就不讓0,1參與選擇,直接從2開始 2 為了判斷n是否是質數,只需要列舉i 2至i 根號n,但是在程式中應該表現為i i n,素數條件如果從i i x改為...