[leetcode]计数质数[javascript]

描述

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

示例:

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

分析

开始直接暴力遍历 ,超出时间限制,后来加了判断小于10的都除以了2/3/5/7,遍历的数量较少到了n的平方根才勉强过了…

var countPrimes = function(n) {
  if (n < 3) {
    return 0
  }
  if (n < 4) {
    return 1
  }
  if (n < 6) {
    return 2
  }
  if (n < 8) {
    return 3
  }
  let count = 4
  for (let i = 10; i < n;i++) {
    if (i % 2 === 0 || i % 3 === 0 || i % 5 === 0 || i % 7 === 0) {
      continue
    }
    let flag = false, tmp = parseInt(Math.sqrt(i)) + 1
    for (let j = 11;j < tmp;j++) {
      if (i % j === 0) {
        flag = true
        break
      }
    }
    if (!flag) {
      count = count + 1
    }
  }
  return count
};

后来查了资料,参考了一些解法,有种叫埃拉托色尼筛选法的方法。

(1)先把1删除(现今数学界1既不是质数也不是合数)
[

image | left
](https://baike.baidu.com/pic/埃拉托色尼筛选法/4524938/0/d041a4a1efa4fcb646106457?fr=lemma&ct=single)
(2)读取队列中当前最小的数2,然后把2的倍数删去

(3)读取队列中当前最小的数3,然后把3的倍数删去

(4)读取队列中当前最小的数5,然后把5的倍数删去

(5)读取队列中当前最小的数7,然后把7的倍数删去

(6)如上所述直到需求的范围内所有的数均删除或读取

var countPrimes = function(n) {
  let arr = [], count = 0
  for (let i = 0; i < n + 1; i++) {
    arr[i] = true // 标记初始化
  }
  for (let i = 2;i < n;i++) {
    if (arr[i]) { // 如果i是质数
      for (let j = i + i;j < n;j = j + i) {
        arr[j] = false // i的n倍数肯定不是质数
      }
      count++
    }
  }
  return count
};

这里如果不对数组赋初始值,在leetcode中会报__超出内存限制__

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值