問題描述:
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;
}
};