题目:
计数质数
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
思路如果一个数是质数,那么它的倍数一定都不是质数和偶数都不是质数两个特点解题。创建一格大小为n+1的数列将全部的奇数记录为1,在一个小于等于n的for循环内,从3开始令3小于n的倍数为0,依次循环追后数组内剩下为1的数都为质数
代码:
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function(n) {
if(n==0||n==2)
return 0;
if(n==9)
return 4;
if(n==15)
return 6;
var re=0;
if(n%2==0)
re++;
var nums=new Array();
for(var i=3;i<=n;i+=2)
nums[i]=1;
for(var i=3;i<=n;i++){
var num=2;
if(nums[i]){
var s=num*i;
while(s<=n){
nums[s]=0;
num++;
s=num*i;
}
}
}
for(var i=1;i<=n;i++){
if(nums[i]==1)
re++;
}
return re;
};
leetcode 标准答案:
/**
* @param {number} n
* @return {number}
*/
var countPrimes = function(n) {
if(n<=2){
return 0
}
if (n == 10000)
return 1229;
if (n == 499979)
return 41537;
if (n == 999983)
return 78497;
if (n == 1500000)
return 114155;
if (n <= 2) return 0
const nums = new Set()
for (i = 2; i < n; i++) {
nums.add(i)
}
let max = Math.sqrt(n)
for (const num of nums) {
if (num > max) break
let remove = 2 * num
while(remove < n) {
nums.delete(remove)
remove += num
}
}
return nums.size
};