計數質數 題目 提示: 解題思路 埃氏篩 線性篩

題目

難度級別:簡單

統計所有小於非負整數 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章