题目描述:
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
AC C++ Solution:
解题思路:首先排除2之外的所有偶数,2默认算一个质数。使用一个标志数组(默认为false),从3开始遍历,每次设置当前数及当前数的倍数的标志位为true。每次遍历到没有标记的数,则计数+1。
class Solution {
public:
int countPrimes(int n) {
if(n <= 2) return 0;
vector<bool> passed(n,false);
int sum = 1;
int upper = sqrt(n);
for(int i = 3; i < n; i+=2) { //偶数一定不是质数,所以每次+2
if(!passed[i]) {
sum++;
if(i>upper)
continue; //i大于n的平方根后就不用设置i的倍数了
for(int j = i*i; j < n; j+=i) //把为i的倍数的位都设置为true,不进入质数计数
passed[j] = true;
}
}
return sum;
}
};