原文:204. 计数质数(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-0204/

题目:

难度:Easy

相关话题:哈希表数学

统计所有小于非负整数n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

思路:

厄拉多塞筛法,比Math.sqrt+for in primes加起来还快。

它是定义一个数组notPrime,表示非质数的数,01不是质数。

接着2是第一个质数,然后把范围内所有2的倍数在notPrime[2的倍数]=true

接着3不在notPrime范围内,因此是下一个质数,然后把3所有的倍数设置为true

以此类推…

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {number} n
 * @return {number}
 */
var countPrimes = function(n) {
  let notPrime = new Array(n);
  let count = 0;
  notPrime[0] = true;
  notPrime[1] = true;
  for (let i = 1; i < n; i=i+2){
    if (!notPrime[i]){
      count++;
      // 对当前质数的所有倍数都定义为非质数,这里从 i*i开始,因为之前的已经计算过了
      for (let j = i*i; j < n; j += i){
        notPrime[j] = true;
      }
    }
  }
  return n>2?count+1:count;
};