问题描述:
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.
源码:
改进的素数表法。用prime存储当前所有的素数,用visit表示当前的数字是否为素数,true表示是素数,false表示是合数。
点睛之笔:if (i % prime[j] == 0) break;
意思就是当6是3的倍数的时候,没必要再算下去了,因为6*2=3*4,6*3=3*6,之前都已经计算过了。
算法中用到了一个定理:合数一定能被素数整除。证明如下:为什么说合数它一定能够被某个素数整除?
class Solution {
public:
int countPrimes(int n) {
// if (n==1) return 0;
if (n<=2) return 0;
vector<bool> visit(n+1, true);
vector<int> prime(n+1, 0);
int num=0;
for (int i=2; i<n; i++){
if (visit[i]){
prime[++num] = i;
}
for (int j=1; j<=num && prime[j]*i<n; j++){
visit[i*prime[j]] = false;
if (i % prime[j] == 0) break;
}
}
return num;
}
};