高效求解质数-- 埃氏筛法

质数的定义:在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。因此对于每个数 x,我们可以从小到大枚举 [2,x−1] 中的每个数 y,判断 y 是否为 xx 的因数。

暴力穷举

n = 151100  
k = 0
z = []
for i in range(2,n):
    for j in range(2,int(i**0.5)+1):  # 开方,减少循环的次数
        if i%j == 0:
            break
    else:
        k+=1
        z.append(z)
print(k) # 个数
print(z) # 质数

埃氏筛

如果 x是质数,那么大于 x 的 n 的倍数 2x,3x,… 一定不是质数,
首先生成一个数组用来储存数字是否是质数,默认都是质数,出现一次质数就将它的倍数全部标记为不是质数,

n = 151100
k = 0
s = [True for i in range(n)]  # 首先默认所有数都是质数
z = []
for i in range(2,n):
    if s[i] ==1:
        k+=1
        z.append(z)
        for j in range(i+i,n,i):   # 将是指数的倍数的数都改为False
            s[j] = False

print(k) # 个数
print(z) # 质数

猜你喜欢

转载自blog.csdn.net/qq_52007481/article/details/124002014