确定给定范围内的素数

时间:2015-04-05 17:54:52

标签: python primes

我想用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]

但是,159不是素数。我错过了什么?

1 个答案:

答案 0 :(得分:2)

else分支在您找到不能被i整除的数字时执行。在这种情况下,这意味着正在添加任何奇数,因为它们不能被2整除,但所有偶数都是915可能不是素数,但它们很奇怪。

如果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]