leetcode【204】【tag Math】Count Primes【c++版本,改進的素數表法】

問題描述:

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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章