Python prime列表错误

时间:2017-04-26 00:35:38

标签: python list primes

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到给定数字&#39; n&#39;的素数列表。 (忽略小于3的数字的情况)

我打算做的是:

  1. 将第一个数字从3提到n(让我们称之为基础)
  2. 将基数与主要列表中的第一个数字进行比较(在本例中为2)
  3. 如果基数不可分,则将其与主要列表中的下一个数字进行比较。
  4. 重复步骤3,直到比较主要列表中的所有数字,或者出现在主要列表中至少有一个可被基数整除的数字。
  5. 如果base与prime列表中的所有数字进行比较且不能被其中任何一个整除,则将其追加到prime列表。
  6. 将base的值增加1并重复步骤2到5 upto base = n。
  7. 无论我为n添加什么值,我只会在打印的主要列表中获得单值2。请帮助找出哪个部分是错误的。

1 个答案:

答案 0 :(得分:0)

您的代码失败的原因是您没有正确检查所有存储的素数 - 您需要第二个循环。幸运的是,Python可以通过两种不同的方式为您提供方便:值列表可以轻松循环,else支持for。修改后的代码应如下所示:

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)

因此,我们使用if循环检查for列表中的所有值,而不是其他prime语句,而这些语句并不完全符合您的想法。将其分配给p)并按照您的预期进行划分。如果模数为0,则循环不会中断,else块将不会运行,如果没有任何素数导致0模数,则else块将被触发,将新发现的素数添加到列表中等等。

示例:

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

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