Count Primes

Description:

Count the number of prime numbers less than a non-negative number, n.

找出小于n的质数的和

 

int countPrimes(int n) {
    int count = 0;
    if(n <= 2)
        return 0;
    else 
    {
        count++;
        for(int i = 3; i < n; i += 2)
        {
            for(int j = 3; j * j <= i; j += 2)
                if(i % j == 0)
                    goto pass;
                else
                    continue;
            count++;
        pass:;
        }
    }
    return count;
}

 

 

class Solution {
public:
       int countPrimes(int n) {
        vector<bool> num(n - 1, true);
        num[0] = false;
        int res = 0, limit = sqrt(n);
        for (int i = 2; i <= limit; ++i) {
            if (num[i - 1]) {
                for (int j = i * i; j < n; j += i) {
                    num[j - 1] = false;
                }
            }
        }
        for (int j = 0; j < n - 1; ++j) {
            if (num[j]) ++res;
        }
        return res;
    } 
};

厄拉多塞筛法

西元前250年,希腊数学家厄拉多塞(Eeatosthese)想到了一个非常美妙的质数筛法,减少了逐一检查每个数的的步骤,可以比较简单的从一大堆数字之中,筛选出质数来,这方法被称作厄拉多塞筛法(Sieve of Eeatosthese)

具体操作:先将 2~n 的各个数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于 n 的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 n 的素数。

其实,当你要画圈的素数的平方大于 n 时,那么后面没有划去的数都是素数,就不用继续判了。如下图:

class Solution {
public:
    int countPrimes(int n) {
        int count = 0;
        if(n <= 2)
            return 0;
        bool *p = new bool[n]();
        for(int i = 2; i * i < n; i++)
        {
            if(!p[i])
            {
                for(int j = 2; j * i < n; j++)
                    p[j * i] = true;
            }
        }
        for(int i = 2; i < n; i++)
            if(!p[i])
                count++;
        delete []p;
        return count;     
        
    } 
};
  • 使用动态数组的方式比上面使用vector的方式快出了10倍左右
posted @ 2015-10-18 09:23  dylqt  阅读(161)  评论(0编辑  收藏  举报