題目
難度級別:簡單
統計所有小於非負整數 n 的質數的數量。
示例 1:
輸入:n = 10
輸出:4
解釋:小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
示例 2:
輸入:n = 0
輸出:0
示例 3:
輸入:n = 1
輸出:0
提示:
0 <= n <= 5 * 106
解題思路
埃氏篩
若一個數爲質數,則它的n倍就一定是一個合數。初始化數組isPrimes,數量爲n,每一項賦值爲1。遍歷數組isPrimes,當它爲1時說明是一個質數,之後求出它的n倍,並賦值0。
const countPrimes = function(n) {
const isPrimes = new Array(n).fill(1)
let count = 0
for(let i = 2; i < isPrimes.length; i++) {
if (isPrimes[i]) {
count++
for(let j = i * i; j < n; j = j + i) {
isPrimes[j] = 0
}
}
}
return count
};
線性篩
與埃氏篩的基礎上在創建質數primes數組,當在isPrimes裏遇到值爲1的質數時,將其添加至primes數組。同時遍歷primes數組,因爲primes內是質數,所以乘上任何數都是合數。當遇到 isPrimes的第i項 % primes[j]的值爲0時,後面的數之前的數已經計算過,跳出循環。
const countPrimes = function(n) {
const isPrimes = new Array(n).fill(1)
const primes = []
for(let i = 2; i < isPrimes.length; i++) {
if (isPrimes[i]) primes.push(i)
for(let j = 0; j < primes.length && i * primes[j] < n; j++) {
isPrimes[i * primes[j]] = 0
if (i % primes[j] === 0) break
}
}
return primes.length
};
題目來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-primes