LeetCode0204. 计数质数

一. 题目
  1. 题目

  2. 示例

二. 方法一: 优化暴力(超时)
  1. 解题思路

  2. 解题代码

    def getPrime(self, num: int):
    	index = 2
        while index <= int(math.sqrt(num)):
            if num % index == 0:
                return False
            index += 1
        return True
    def countPrimes(self, n: int) -> int:
        count = 0
        for ele in range(2, n):
            if self.getPrime(ele):
                count += 1
        return count
    
  3. 分析

三. 方法二: 埃拉托斯特尼筛法
  1. 解题思路
    在这里插入图片描述
    图片来源

  2. 解题代码

    def countPrimes(self, n: int) -> int:
    	# 如果n < 2, 则没有质数
        if n < 2:
            return 0
        # 用于存放质数(质数用1, 合数用0)
        result = [1] * n
        result[0] = result[1] = 0
        for ele in range(int(math.sqrt(n)) + 1):
        	# 如果一个数是质数, 则它的倍数就是合数
            if result[ele] == 1:
                # for e in range(ele * ele, n, ele):
                #     result[e] = 0
                # 之所以从ele的平方开始判断, 
                # 是因为在遍历到ele时, ele* ele之前的所有合数都已经被排除掉了,
                # 这样可以提高效率
                result[ele * ele: n: ele] = [0] * ((n - 1 - ele * ele) // ele + 1)
        return sum(result)
    
  3. 分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值