啊,不用埃拉託斯特尼篩法,怎樣都是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;
}
};