python力扣刷题记录——204. 计数质数

题目:

统计所有小于非负整数 n 的质数的数量。
在这里插入图片描述

方法一:
暴力法

class Solution:
    def countPrimes(self, n: int) -> int:
        count = 0
        if n > 1:
            for i in range(2, n):
                flag = True
                for j in range(2, i):
                    if i % j == 0:
                        flag = False
                        break
                if flag:
                    count += 1
        return count

方法虽简单,但是时间超时了,无法通过测试

方法二:
厄拉多塞筛法,力扣上看到大神分享的方法:
比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推.
在这里插入图片描述

class Solution: 
    def countPrimes(self, n: int) -> int:
        if n < 3:
            return 0
        else:
            output = [1] * n  # 产生一个元素全部为1的列表
            output[0], output[1] = 0, 0  # 0,1不是质数,直接赋值为0
            for i in range(2, int(n**0.5)+1):  # 从2开始,output[2]==1表示第一个质数是2,然后将2的倍数对应的索引全部赋值为0,此时下一个数output[3]==1,也是表示质数,同样划去3的倍数,以此类推
                if output[i] == 1:
                    output[i*i:n:i] = [0] * len(output[i*i:n:i])
            #最后output中的数字表示该位置上的数为质数,然后求和即可
        return sum(output)

  • 0
    点赞
  • 1
    收藏 更改收藏夹
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

钟灵毓秀M

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值