看了题解
想法:
- 访问到一个质数时,结果加 1,同时将能被该质数整除的数排除(不是质数)
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function(n) {
// 题解:埃拉托斯特尼筛法在每次找到一个素数时,将能被素数整除的数排除掉。
var notPrime = [], i = 0, j = 0, ans = 0;
for(i = 0; i < n; i++) {
notPrime[i] = false;
}
for(i = 2; i < n; i++) {
if(notPrime[i]) { // 如果不是质数,则跳过
continue;
}
ans++; // 如果是质数则,answer = answer + 1
// 同时将能被该质数整除的数排除
// 从 j = i * i 开始,因为:若 j = i * k,而 k < i,那么在
// j 初始化为 k * k 的那一轮中,已经有过 j = k * i 了
for(j = i * i; j < n; j += i) { // j = i * (i + 1) 即:j = i * i + i = j + i
notPrime[j] = true;
}
}
return ans;
};
另:有些题解用 isPrime 数组记录是质数的数
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function(n) {
var isPrime = [], i = 0, j = 0, ans = 0;
for(i = 0; i < n; i++) {
isPrime[i] = true;
}
for(i = 2; i * i < n; i++) {
for(j = i * i; j < n; j += i) { // i 整除 j 且 j < n
isPrime[j] = false;
}
}
for(i = 2; i < n; i++) { // 统计质数
if(isPrime[i]) {
ans++;
}
}
return ans;
};