题目:
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
};
纯属个人见解,若有不对,请留言指正,不胜感激。