Count Primes

啊,不用埃拉託斯特尼篩法,怎樣都是time超了......具體篩法就是那個圖,下面這段話是別處找的,能理解大致意思,但是有一點我理解的和他不一樣,這個找素數應該是遍歷中當前的下一個沒被標記的就是素數,而不用全找完了再遍歷一圈,看下面的代碼就知道了。

這道題給定一個非負數n,讓我們求小於n的質數的個數,題目中給了充足的提示,解題方法就在第二個提示埃拉託斯特尼篩法Sieve of Eratosthenes中,這個算法的過程如下圖所示,我們從2開始遍歷到根號n,先找到第一個質數2,然後將其所有的倍數全部標記出來,然後到下一個質數3,標記其所有倍數,一次類推,直到根號n,此時數組中未被標記的數字就是質數。我們需要一個n-1長度的bool型數組來記錄每個數字是否被標記,長度爲n-1的原因是題目說是小於n的質數個數,並不包括n。 

 

class Solution {
public:
    int countPrimes(int n) {
        vector<bool> sign(n,false);
        int count=0;
        int upper=sqrt(n);
        for(int i=2;i<n;i++)
        {
            if(!sign[i])
            {
                count++;
                if(i>upper)
                continue;
                for(int j=i;j<n;j+=i)
                {
                    sign[j]=true;
                }
            }
        }
        return count;
    }
};


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