[LeetCode] Count Primes

Description:

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

使用sieve of Eratosthenes方法对质数进行筛选。

题目要求就是写出这个算法。

原理是:给出要筛数值的范围n,找出出sqrt{n}以内的素数}p_{{1}},p_{{2}},dots ,p_{{k}}。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。

算法使用了STL中的count函数

algorithm头文件定义了一个count的函数,其功能类似于find。这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。

代码如下

class Solution {
public:
    int countPrimes(int n) {
        vector<bool> prime(n, true);
        prime[0] = false, prime[1] = false;
        for (int i = 2; i < sqrt(n); i++) {
            if (prime[i]) {
                for (int j = i * i; j < n; j += i) {
                    prime[j] = false;
                }
            }
        }
        return count(prime.begin(), prime.end(), true);
    }
};
// 46 ms

 附上第一次写的TLE算法。

思路比较简单,判断给定范围内每个数字是否为质数并统计。

class Solution {
public:
    int countPrimes(int n) {
        int res = 0;
        if (isPrime(n))
            res = -1;
        for (int i = 0; i <= n; i++) {
            if (isPrime(i))
                res++;
        }
        return res;
    }
    
    bool isPrime(int n) {
        if (n <= 3)
            return n > 1;
        for (int i = 2; i <= sqrt(n); i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
};
// TLE
TLE
原文地址:https://www.cnblogs.com/immjc/p/8204582.html