# 埃拉托斯特尼筛法

埃拉托斯特尼筛法(sieve of Eratoshenes),简称埃氏筛,也称素数筛。这是一种简单且历史悠久的筛法,用来寻找一定范围内所有的质数

原理:从2开始,将每个质数的各个倍数都标记为合数。一个质数的各个倍数,是一个差为此质数本身的等差数列。

提示

埃氏筛与试除法的区别在于,埃氏筛是以质数来测试每个待测数是否能被整除。

# 算式

给出要筛数值的范围n,找出平方根n以内的质数。

  • 先用2去筛,即把2留下,把2的倍数剔除掉;
  • 再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;
  • 接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;
  • 不断重复下去......

# 效果图

# 代码实现

/**
 * @param {number} n
 * @return {number}
 */

const countPrimes = function(n) {
    // 默认全部数为质数
    const arr = Array(n).fill(true);
    let count = 0;

    // 优化算法,最小因子为2,最大因子平方不会超过数
    for(let i = 2; i * i < n; i++) {
        // 如果数字为质数
        if(arr[i]) {
            // 将其倍数都标记为合数
            // 等差数列:j += i
            for(let j = i * i; j < n; j += i) {
                arr[j] = false;
            }
        }
    }

    for(let i = n; i >= 2; i--) {
        if(arr[i]) {
            count += 1;
        }
    }

    return count;
};
最近更新时间: 2023/3/21 19:40:56