计数质数

埃拉托色尼筛法

其基本步骤是从最小的素数2开始,将该素数的所有倍数标记成合数,而下一个尚未被标记的最小自然数3即是下一个素数。如此重复这一过程,将各个素数的倍数标记为合数并找出下一个素数,最终便可找出一定范围内所有素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function (n) {
if (n < 2) return 0;
const isPrime = Array(n).fill(true);
isPrime[0] = isPrime[1] = false;
for (let i = 0; i * i < n; i++) {
if (isPrime[i]) {
for (let j = i; j * i < n; j++) {
isPrime[j * i] = false;
}
}
}
// return isPrime.filter(Boolean).length
// isPrime.filter(o => Boolean(o)).length
return isPrime.filter((o) => o).length;
};

chatGPT给我一段很有意思的代码
return isPrime.filter(Boolean).length

Array.prototype.filter(fn)
filter(fn)接收一个回调函数fn,这个函数返回true的元素会被保留下来:
arr.filter(x => x > 0); // 只保留大于0的元素

Boolean是什么?

1
2
3
4
5
Welcome to Node.js v16.13.2.
Type ".help" for more information.
> typeof Boolean
'function'
>

Boolean本质上是一个函数
Boolean(n)返回他自己就是一个布尔值
这样子将可能不直观
来看node代码

1
2
3
4
5
Welcome to Node.js v16.13.2.
Type ".help" for more information.
> Boolean(false)
false
>

把false这个值传递给Boolean这个构造函数,他返回了Boolean(false)这个值,而这个值就是false
所以上面的代码就相当于

1
return isPrime.filter(o => Boolean(o)).length

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。