Python prime列出重复bug

时间:2016-02-17 17:15:13

标签: python python-3.x primes

尝试创建一个程序,列出设定间隔中的素数(必须介于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))

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

3 个答案:

答案 0 :(得分:0)

您只想在之后将数字添加到素数列表中,并检查了所有可能的除数。这意味着您只能在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)

答案 1 :(得分:-1)

在循环中:

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

答案 2 :(得分:-1)

确保您只添加一次。 问题是,在找到分隔i的数字num之前,num会添加到列表中。很简单,您将在列表中多次使用每个素数。事实上,如果n为素数,则列表n次为n-2。您还将在列表中包含所有奇数。 只有偶数才会出现在列表中,因为您测试可分性的第一个数字是22除以所有偶数。

如果您的算法没有太多变化,您可以引入默认情况下设置为isPrime的标记True,每当您找到i除以num时在打破循环之前将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))