Leetcode 204. 计数质数(Python3)

204. 计数质数

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

示例:

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

代码:

class Solution(object):
    def countPrimes(self, n):
        if n <2:return 0
        cnt = 0
        for i in range(2,n):
            cur = 0            
            for j in range(2,int(i**0.5)+1):
                if i % j == 0:
                    cur = 1
                    break
            if not cur:
                cnt += 1
        return cnt

效率极低。

大佬写法:

class Solution:
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        '''
        西元前250年,希腊数学家厄拉多塞(Eeatosthese)想到了一个非常美妙的质数筛法,减少了逐一检查每个数的的步骤,
        可以比较简单的从一大堆数字之中,筛选出质数来,这方法被称作厄拉多塞筛法(Sieve of Eeatosthese)。 具体操作:
        先将 2~n 的各个数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数
        是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数……
        依次类推,一直到所有小于或等于n的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于
        n的素数。
        '''
        if n < 3:
            return 0
        prime = [1] * n
        prime[0] = prime[1] = 0
        for i in range(2, int(n**0.5) +1):
            if prime[i] == 1:
                prime[i*i:n:i] = [0]*len(prime[i*i:n:i])
        return sum(prime)

猜你喜欢

转载自blog.csdn.net/qq_38575545/article/details/86495651