Python 前N个质数

一道算法题,统计前n个质数,很多人的第一想法是从1开始遍历到N,注意判断是否为质数,如果为质数,就加1,如果不是质数,就不进行任何操作,这种方法非常非常耗时、浪费空间,下面提供一种新的思路


埃式筛:

可能很多人都不知道这个思想,埃拉托斯特尼筛法
简称就是埃式筛,这个思想的精髓在于一句话:把不大于根号n的所有素数的倍数剔除,剩下的就是素数,下面有一个动图方便大家理解:
Python 前N个质数_第1张图片
此图非本人所绘


代码实现:

代码如下:

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))


你可能感兴趣的:(Python,python,算法)