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

 

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