LeetCode算法题204:计数质数解析

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

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

寻找质数这种题的最简单的解法就是依照定义,遍历每一个数,然后从2开始到其本身减1,看是否能被中间的数整除,能则不是质数。但是这样的解法时间复杂度太高。有一种方法叫埃拉托斯特尼筛法,简称埃氏筛,也称素数筛。这是一种简单且历史悠久的筛法,用来找出一定范围内所有的素数。计算过程是:给出要筛数值的范围n,找出 n \sqrt n 以内的素数 p 1 , p 2 , . . . , p k p_1,p_2,...,p_k 。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。如图所示:
埃拉托斯特尼筛法
所以程序如下:
C++源代码:

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

python3源代码:

class Solution:
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 2:
            return 0
        l = [1] * n
        l[1] = l[0] = 0
        allPrimes = 0
        limit = int(math.sqrt(n)) + 1
        for i in range(2, limit):
            if l[i]:
                for j in range(i*i, n, i):
                    l[j] = 0
        return sum(l)

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/83987153