尝试创建一个程序,列出设定间隔中的素数(必须介于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))
然而,当我运行此代码时,一些素数在列表中重复多次,使其长得比它应该长。我怎样才能解决这个问题?提前感谢您的帮助。
答案 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
。您还将在列表中包含所有奇数。
只有偶数才会出现在列表中,因为您测试可分性的第一个数字是2
,2
除以所有偶数。
如果您的算法没有太多变化,您可以引入默认情况下设置为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))