一道算法题,统计前n个质数,很多人的第一想法是从1开始遍历到N,注意判断是否为质数,如果为质数,就加1,如果不是质数,就不进行任何操作,这种方法非常非常耗时、浪费空间,下面提供一种新的思路
埃式筛:
可能很多人都不知道这个思想,埃拉托斯特尼筛法
简称就是埃式筛,这个思想的精髓在于一句话:把不大于根号n的所有素数的倍数剔除,剩下的就是素数,下面有一个动图方便大家理解:
此图非本人所绘
代码实现:
代码如下:
def countPrimes(n: int) -> int:
# 0,1都不是质数,小于0的自然更不是
if n < 2:
return 0
# 创建一个长度为n的、元素全为1的列表
isPrimes = [1] * n
# 将0,1设置为0
isPrimes[0] = isPrimes[1] = 0
# 遍历,从2到根号N(到根号N是为了减少循环次数)
for i in range(2, int(n ** 0.5) + 1):
# 如果元素等于1,就对列表进行赋值操作,从N的平方开始,到N为止,以元素的下标为步长
if isPrimes[i] == 1:
isPrimes[i * i:n:i] = [0] * len(isPrimes[i * i:n:i])
# 统计列表元素的和,也就是统计1的个数
return sum(isPrimes)
if __name__ == '__main__':
m = int(input())
print(countPrimes(m))