题目:统计所有小于非负数整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
题目分析:其实就是判断小于n的所有质数的个数。我使用的是筛选法:
设置标记数组flag[n+1],初始化都为false,已知2是质数,那么可以肯定的是凡是2的倍数的数都不是质数了,将这些数的标记都置为true。然后往下遍历发现3的标记仍未false说明3是质数,那么所有3的倍数的数都不是质数了,更新对应的标记。继续遍历下去;
class Solution {
public:
int countPrimes(int n) {
bool flag[n+1];
for(int i=0;i<n+1;i++){
flag[i]=true; //标记数组初始化
}
int cnt=0; //质数的个数
for(int i=2;i<n;i++){
if(flag[i]){ //如果这个数是质数
for(int j=i+i;j<n;j+=i){ //那么该质数的所有倍数都不是质数了
flag[j]=false;
}
cnt++; //计数加一
}
}
return cnt;
}
};