题目:
统计所有小于非负整数 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)