204. 计数质数
给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。
解: 总体上思路是先假定有n个质数,每找到一个不是质数的数就减少一个。首先,所有偶数肯定不是质数,所以直接总体除掉一半。然后从3开始遍历,把3 * 3, 3 * 5,3 * 7... 3 * x < n,这些数全都不是质数,所以全都减掉。如果某个数是第一次碰到,那么质数个数减少一个,并且创建一个非质数数组,把这个数对应下标置为true,表明已经计算过这个数了,下次碰到就跳过。遍历完3的结果之后接着遍历剩余所有奇数的结果即可。
const countPrimes = function(n) {
if (n < 3) return 0
// 质数个数
let count = Math.trunc(n / 2)
// 记录不是质数的数
const notPrimes = []
// 从3开始遍历,每次增加2,因为偶数不需要遍历,在之前已经减过了
for (let i = 3; i * i < n; i += 2) {
if (notPrimes[i]) continue
// j从i开始遍历,以3,5来举例,3 * 5在i === 3的时候计算过一次 所以来到i === 5的时候不需要从头再算一次。
for (let j = i; i * j < n; j += 2) {
if (!notPrimes[i * j]) {
count--
notPrimes[i * j] = true
}
}
}
return count
};