我想用Python来确定指定范围内的所有素数,例如最多20个。我有以下代码:
p = [ ]
for i in range(0, 20):
for x in range(2, i):
if i%x == 0:
break
else:
p = p + [i]
break
print p
输出结果为:
[3, 5, 7, 9, 11, 13, 15, 17, 19]
但是,15
和9
不是素数。我错过了什么?
答案 0 :(得分:2)
else
分支在您找到不能被i
整除的数字时执行。在这种情况下,这意味着正在添加任何奇数,因为它们不能被2
整除,但所有偶数都是。 9
和15
可能不是素数,但它们很奇怪。
如果for
循环已经测试了范围内的所有整数,那么您应该只添加一个数字,而不是if
测试失败时。您可以通过 unindenting else
分支执行此操作,以使其与for
循环匹配。
而不是与if
:
for ...:
if ...:
else:
与for
循环匹配:
for ...:
if ...:
else:
因为只有在使用for
语句break
循环 结束时才执行此操作,例如当所有数字都经过测试并且无法划分x
时:
for i in range(0, 20):
for x in range(2, i):
if i%x == 0:
break
else:
p = p + [i]
请注意,break
可以从else
套件中移除,因为那时您不再处于循环中。
请注意,要查找素数,您只需要测试该数字的平方根;如果x
可以被数字i
整除,那么它也可以被i
的所有除数整除。见Why do we check up to the square root of a prime number to determine if it is prime?
在列表中添加一个数字也可以用list.append()
完成,比使用另一个列表的addinion运算符更清晰:
for i in range(20):
if i < 2:
continue # not prime numbers either
for x in range(2, int(i ** 0.5) + 1):
if i % x == 0:
# found a divisor, abort search
break
else:
p.append(i)
演示:
>>> p = []
>>> for i in range(20):
... if i < 2:
... continue # not prime numbers either
... for x in range(2, int(i ** 0.5) + 1):
... if i % x == 0:
... # found a divisor, abort search
... break
... else:
... p.append(i)
...
>>> p
[2, 3, 5, 7, 11, 13, 17, 19]