統計所有小於非負整數 n 的質數的數量。
示例 1:
輸入:n = 10
輸出:4
解釋:小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
示例 2:
輸入:n = 0
輸出:0
示例 3:
輸入:n = 1
輸出:0
0 <= n <= 5 * 106
這裡用的是埃式篩法
本題需要注意 資料範圍 510^6,在ii的時候,會溢位,因為要強轉為long
思路:開創乙個boolean陣列,下標為0-n,用於儲存是否是素數,如果不是素數那麼就跳過,是素數的話 這個素數的倍數一定不是素數,例如 2i,3i…肯定不是素數,將其標誌位true,在下次判斷時直接跳過即可。
還可以進一步優化,那就是不從這個素數的2倍開始標誌,直接從ii倍開始標誌,因為ii之前的數 肯定已經被比當前這個素數更小的素數標記過,例如,2*i,一定被2的i倍標記過,因為我們不需要在通過i的二倍來標記這個數。
class
solution
//如果這個數是素數,那麼從i的倍數開始到n,就肯定不是素數,因為是i的倍數
//這裡可以不從2*i開始,因為如果2*i不是素數,那麼這個2*i一定已經被某個小於i的倍數標記過
//因為我們從x*x 到 n開始標記 查詢不是素數的值即可
ans++
;//這裡n的 範圍是5*10^6,用int會越界,因為用long儲存
//注意這裡一定要在i*i之前加上強轉,不加上強轉就算j是long也沒用,因為傳過去的時候已經溢位的情況了
for(
long j =
(long
)i*i;j < n;j = j + i)
}return ans;
}}
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...