【问题标题】:Python prime listing repetition bugPython 主要列表重复错误
【发布时间】:2016-05-29 13:12:14
【问题描述】:

试图创建一个程序,列出设定间隔内的素数(必须在 1 到 500 之间),因此不允许用户输入。到目前为止,这是我的代码:

list=[]
for num in range(1, 500):
    if num > 1:
        for i in range(2, num):
            if (num % i) == 0:
                break
            else:
                list.append(str(num))
print(','.join(list))

但是,当我运行此代码时,列表中的某些素数会重复多次,这使得它比应有的长得多。我怎样才能解决这个问题?提前感谢您的帮助。

【问题讨论】:

  • 问题是直到你找到一个除以num的数字inum被添加到列表中。很简单,您将多次在列表中找到每个素数。事实上,如果n 是素数,那么n 将出现在n-2 次列表中。您还将在列表中包含所有奇数。

标签: python python-3.x primes


【解决方案1】:

您只想在检查了所有可能的除数之后将该数字添加到素数列表中。这意味着您只能在 for 循环完成后添加它。

一个很好的方法是使用可选的else clause on for loops

循环语句可能有一个else 子句;它在循环时执行 通过用尽列表(for)或当 条件变为假(使用while),但不是当循环 由break 语句终止。

您可以通过仅检查已找到的素数模数来改进此功能。由于所有非素数都有素根,因此您只需要检查一个数是否可​​以被较小的素数整除即可确定它是否为素数。

primes = []
for i in range(2, 501):
    for p in primes:
        if i % p == 0:
            break
    else:
        primes.append(i)

【讨论】:

  • 谢谢你,这帮助我更好地理解了它
【解决方案2】:

在循环中:

for i in range(2, num):
    if (num % i) == 0:
        break
    else:
        list.append(str(num))

您为每个i 附加一次素数。 else 应该与 for 对齐:

for i in range(2, num):
    if (num % i) == 0:
        break
else:   # note: different indentation!
    list.append(str(num))

在python循环中可以有一个else子句,只有在循环内没有执行break时才会执行。在很多情况下,它们可以用来避免布尔标志。

所以代码:

found = False
for x in iterator:
    if predicate(x):
        found = True
        break

if not found:
    # do default action

可以替换为:

for x in iterator:
    if predicate(x):
        break
else:
    #do default action

【讨论】:

  • 循环的 else 是一件好事,我不知道。不过要确保的是,OP 脚趾不想包含1。在这种情况下,他必须从外部循环中排除 1,这无论如何都是多余的。
  • @innoSPG OP 的代码已经包含一个 if num > 1 所以1 根本不会被检查。
【解决方案3】:

确保每个只添加一次。 问题是,直到找到一个除以num 的数字inum 才会添加到列表中。很简单,您将多次在列表中找到每个素数。事实上,如果n 是素数,那么n 将出现在n-2 次列表中。您还将在列表中包含所有奇数。 只有偶数不会出现在列表中,因为您要测试可除性的第一个数字是2,而2 会除所有偶数。

在您的算法不做太多更改的情况下,您可以引入一个默认设置为True 的标志isPrime,并且每当您找到除以numi 时,您将isPrime 设置为True在打破循环之前。你的程序变成:

list=[]
for num in range(1, 500):
    if num > 1:
        isPrime=True
        for i in range(2, num):
            if (num % i) == 0:
                isPrime = False
                break
        if isPrime:
            list.append(str(num))
print(','.join(list))

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 2016-06-20
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多