求 2~2000 的所有素数.有足够的内存,要求尽量快

57 阅读1分钟
def sieve_of_eratosthenes(limit):
    # 创建一个布尔数组,初始时假设所有数都是素数
    is_prime = [True] * (limit + 1)
    is_prime[0] = is_prime[1] = False  # 0 和 1 不是素数
    
    p = 2
    while p * p <= limit:
        if is_prime[p]:
            # 将 p 的所有倍数标记为非素数
            for i in range(p * p, limit + 1, p):
                is_prime[i] = False
        p += 1
    
    # 收集所有素数
    primes = [num for num in range(2, limit + 1) if is_prime[num]]
    return primes

# 求 2 到 2000 之间的所有素数
primes = sieve_of_eratosthenes(2000)
print(primes)

这个代码的工作原理如下:

  1. 创建一个布尔数组 is_prime,初始时假设所有数都是素数。
  2. 将 0 和 1 标记为非素数。
  3. 从 2 开始,将每个素数的倍数标记为非素数。
  4. 最后,收集并返回所有标记为素数的数。