204. 计数质数

力扣原题链接(点我直达)

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

第一版,暴力法,超时

int isPrimes(int i) {
    for (int j = 2; j * j <= i; ++j) {
        if (i % j == 0) return 0;
    }

    return 1;


}
int countPrimes(int n) {
    if (n <= 2) return 0;

    int sum = 0;
    for (int i = 2; i < n; ++i) {
        sum += isPrimes(i);
    }

    return sum;

}


第二版,比较牛逼的一种解法

执行用时 :40 ms, 在所有 cpp 提交中击败了91.18%的用户

内存消耗 :21.6 MB, 在所有 cpp 提交中击败了5.23%的用户

这题搜到一个非常牛逼的算法,叫做厄拉多塞筛法. 比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推.

int countPrimes(int n) {
    vector<int> a(n);
    int count = 0;
    for (int i = 2; i < n; i++)
        a[i] = 1;

    for (int i = 2; i < n; i++)
        if (a[i])
        {
            count++;
            for (int j = 2 * i; j < n; j += i)
                a[j] = 0;
        }

    return count;

}