埃式筛/厄拉多塞筛法/Sieve_of_Eratosthenes/计数质数

今天的每日一题是计数质数
要求统计所有小于非负整数 n 的质数的数量。

  • 为了解这题,学到了一个古老的魔法,快速寻找质数。

搜了下百度,keywords = “prime” "python"的时候,出来的大部分都是暴力法,容易超时啊啊啊。原以为质数这种常用的东西会有包,结果一个个的全暴力,太没有美感了!(其实我一开始也写的brute force…

Let’s start the advanture!

In mathematics, the sieve of Eratosthenes is an ancient algorithm for finding all prime numbers up to any given limit.

思想非常简单,我们从2开始遍历[1,2,…,n]的数组,遇到质数的时候(比如2),就把数组类所有它的倍数都标记成合数(对应2的话,一下子就把4,6,8,…所有的偶数都筛掉了)。

什么时候终止呢?当我遍历的元素的平方大于n的时候就可以停了。

下面这张图就很清晰了。实际上只筛了2,3,5,7的倍数,到11的时候就终止了,剩下的没被筛出去的数字都是质数了。
在这里插入图片描述
理论依据是算术基本定理

任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。

如果在根号n以内都找不到因子,那么这些剩下的数字,只可能是老光棍质数啦。

附上代码:

class Solution:
    def countPrimes(self, n: int) -> int:
        if n <= 2: return 0
        isPrime = [1] * n
        isPrime[0], isPrime[1] = 0, 0
        for i in range(2,int(n**0.5)+1):
            if isPrime[i] == 0:
                continue
            for x in range(2,(n-1)//i+1):
                isPrime[i*x] = 0
        return sum(isPrime)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值