1 题目
Count the number of prime numbers less than a non-negative number, n.
Example:
Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.
2 尝试解
2.1 分析
从2开始,每找到一个质数,就把所有由其构成的小于N的合数标记出来,比如N=10时,2为第一个质数,则4、6、8标记为合数,3为第二个质数,则6、9标记为合数,4为合数,跳过。
2.2 代码
class Solution {
public:
int countPrimes(int n) {
vector<int> primes(n,0);
for(int i = 2; i < n; i++){
//for each prime, calculate all possible multiple numbers less than n, and mark them as non-prime,
if(primes[i] == 0){
primes[i] = 1;
int product = 2;
while(product*i < n) {
primes[product*i] = -1;
product ++;
}
}
}
int result = 0;
for(auto num:primes){
if(num == 1) result++;
}
return result;
}
};
3 标准解
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) {
if (!passed[i]) {
sum++;
//avoid overflow
if (i>upper) continue;
for (int j=i*i; j<n; j+=i) {
passed[j] = true;
}
}
}
return sum;
}