python---计数质数

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

示例:

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

1. 看到这道题的时候,第一反应是用遍历。

class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        def isPrimes(n):
            if n == 1:
                return bool(0)            
            for i in range(2, int(n**0.5) + 1):
                if n % i == 0:
                    return bool(0)
            return bool(1)
        count = 0
        for i in range(1, n):
            if isPrimes(i):
                count += 1
        return count

2. 查了一下,发现一个十分炫酷的方法:厄拉多塞筛法,具体讲解可以参考这个博客:https://blog.csdn.net/github_39261590/article/details/73864039

大致意思就是从2开始,将1~n中2的倍数都划掉,只留最开始的一个2;接下来是未做处理的3,将3的倍数都划掉,只留下一个3;类似的这样下去。。。直到所有的数字都被处理过(留下或者划掉),最终留下的数字是n以内的质数。

对于这道题,可以不需要知道具体的质数是谁,所以只需要用逻辑01计数即可.

def countPrimes(self, n):
    if n < 3:
        return 0
    primes = [1] * n   # 广播
    primes[0] = primes[1] = 0
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            primes[i * i: n: i] = [0] * len(primes[i * i: n: i])  # i*i到n之间隔i取一次数
    return sum(primes)

 

你可能感兴趣的:(python)