leetcode javaScript 204. Count Primes

题目:

Description:
Count the number of prime numbers less than a non-negative number, n.

翻译:计算小于n的素数有多少个(n为非负数)

解法一:

思路:使用for循环,从0开始,将小于n的每个数字都拿去判断一下是不是素数,如果是的话,就在计数的变量count上加1
所以难点就在于如何判断一个整数是不是素数,这里我使用的是素数的分布规律,简单而言,素数的分布是有规律的,具体可以看https://baike.baidu.com/item/%E7%B4%A0%E6%95%B0%E5%88%86%E5%B8%83“>素数分布
运行结果:beat 49%左右


function isPrime(n) {
    if(n === 2 || n === 3) {
        return true
    }
    if((n % 6 !==1) && (n % 6 !== 5)){
        return false
    }
    var sqrt_n =  Math.sqrt(n)
    for(var i = 3; i <=  sqrt_n; i+=2){
        if(n % i === 0) {
            return false
        }
    }
    return true
}
function countPrimes(n) {
    var count = 0
    for(var i = 2; i < n; i++) {
        if(isPrime(i)){
            count++
        }
    }
    return count
}

排名第一的大神解法:

思路:
以n=100为例
使用了一个数组primes,这个数组保存了100个true,表示0-99个数字
因为0,1不算素数,所以i从2开始计算。
判断一个数是不是素数的关键在于i * j 是否等于一个小于100的数字,如果有这样的一个数字存在,就表示这个数字能够被除了1和它自身的数字除尽,所以将它所在的primes[i * j]变成false,但是最后去数primes数组中有多少个true就好。
个人认为巧妙在于:比如i = 2的时候,第二个for循环就将所有100以内,因数中有2的数字全部变成了false,所以大大降低了后面的计算量。

var countPrimes = function(n) {
  const primes = Array(n).fill(true)
  let count = 0
  for (let i = 2; i < n; i++) {
    if (primes[i]) {
      count++
      for (let j = 2; i * j < n; j++) {
        primes[i * j] = false
      }
    }
  }
  return count  
};

纯属个人见解,若有不对,请留言指正,不胜感激。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值