力扣(leetcode) 204. 计数质数 (埃氏筛)

题目在这:https://leetcode-cn.com/problems/count-primes/

题目分析:

质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)

思路分析:

这道题直接暴力循环会超时。

看了看大佬们的思路,用了个方法叫埃氏筛

我们知道。2 和3 都是质数。而2 的任意整数倍都是非质数(合数)。比如:
2 * 2 ,2 * 3 ,2 * 4。3 * 2 ,3 * 3, 3 * 4.

且:
任何一个合数(非质数),都可以以唯一的形式被写成有限个质数的乘积,即分解质因数。

超过根号 n 的合数都可以进行因式分解,其中最小的因子必然为根号 n 以内的一个质数。

这样一来我们只需剔除掉根号 n 以内的质数倍数,即排除了 n 以内的所有合数,剩下来的就都是质数啦。

可以创造一个数组,数组长度等于所给数,让里面都为True,即表示为质数,然后筛选所有合数,标记为False。最后统计数组中True的个数即为质数个数。

完整代码

class Solution:
    def countPrimes(self, n: int) -> int:
        if n < 2:
            return 0
        import math
        res = [True] * n # 全部标记为质数  

        res[0] = False
        res[1] = False
        lenght = math.sqrt(n)
        for i in range(2,int(lenght)+1): # 埃氏筛掉所有合数
            for j in range(i * i,n,i):
                res[j] = False

        print(res.count(True))
        return res.count(True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值