Python 主要列表错误

Python prime listing error

n = int(input("input n"))
prime = [2]
base = 3
order = 0

while base < n + 1:
    if order < len(prime):
        if base % prime[order] == 0:
            order = len(prime)
        else:
            order += 1
    else:
        prime.append(base)
    order = 0
    base += 1
print (prime)

我正在尝试创建一个从 1 到给定数字 'n' 的素数列表。 (忽略小于 3 的数字的大小写)

我打算做的是:

  1. 将第一个数字从 3 变为 n(我们称其为基数)
  2. 将基数与素数列表中的第一个数字(在本例中为 2)进行比较
  3. 如果基数不可整除,将其与素数列表中的下一个数字进行比较。
  4. 重复步骤3,直到比较完素数列表中的所有数字或至少出现一个素数列表中可整除基数的数。
  5. 如果 base 与素数列表中的所有数字相比并且不能被其中任何一个整除,则将 base 添加到素数列表。
  6. 将 base 的值增加 1 并重复步骤 2 到 5 直到 base = n。

无论我为 n 设置什么值,在打印的素数列表中我只得到单个值 2。请帮忙找出错误的地方。

您的代码失败的原因是因为您实际上没有正确检查所有存储的质数 - 为此您需要第二个循环。幸运的是,Python 通过两种不同的方式让您轻松完成此操作:可以轻松循环遍历值列表,for 支持 else。修改后的代码应如下所示:

n = int(input("input n"))
prime = [2]
base = 3

while base < n + 1:
    for p in prime:
        if base % p == 0:
            # base is NOT a prime, break out
            break
    else:
        # loop ran to completion
        prime.append(base)
    base += 1
print (prime)

因此,我们使用 for 循环检查 prime 列表中的所有值(将其分配给 p) 并按照您的预期进行除法。如果模数为 0,则循环不干净地中断并且 else 块不会 运行,并且如果素数的 none 导致模数为 0 else 块将被触发,将新发现的素数添加到列表中,依此类推。

示例:

$ python3 foo.py
input n19
[2, 3, 5, 7, 11, 13, 17, 19]

如果你想保留现有的逻辑(即没有for循环),你可以在里面再做一个while循环,记得在它之前设置order0