一. 题目
-
题目
-
示例
二. 方法一: 优化暴力(超时)
-
解题思路
-
解题代码
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
-
分析
三. 方法二: 埃拉托斯特尼筛法
-
解题思路
图片来源 -
解题代码
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)
-
分析