0

我编写了这个 Python 代码来打印直到 1000 的所有素数:

primes = []

for prime in xrange(1, 1000):
    for b in xrange(2, prime):
        if (prime % b == 0):
            break
        else:
            primes.append(prime)

print primes

但是,如果一个数字是素数,它会在移动到下一个数字之前被附加很多次。我尝试使用continue而不是,break但这不起作用。

我还在上面添加了更多代码(有效),以简单地将数组输出到文本文件中。它太大了,我什至无法将它粘贴到这里。

如何将每个素数仅附加一次而不是多次?

4

2 回答 2

4

Python 中有一个功能可以在这里非常有效地使用。只需像这样更改缩进:

primes = []

for prime in xrange(1, 1000):
    for b in xrange(2, prime):
        if (prime % b == 0):
            break
    else:
        primes.append(prime)

print primes

也就是说,取消缩进该else子句。这样,它不是循环else的,if而是for循环的。for循环可以有一个分支,该else分支在循环执行完所有计划的迭代后执行。如果有一个break被调用,它不会被执行。

您可以在此处使用它,而无需更改大量原始代码。

当然,在您的原始版本中,每次循环迭代中测试的数字都不是非质数,该测试的数字被附加(这不是您想要的)。

另请注意,1它不是素数(至少自 1801 年的高斯以来,有人说,甚至自从欧几里德(公元前 600 年)首次写到素数以来,尽管自 19 世纪以来就有异端邪说),所以你的外循环应该开始2

但请注意但以理在他的回答中写了什么;您不必一路单步执行,prime因为在达到 的平方根后prime,您可以退出。我总是比较b * bprime但也许计算sqrt(prime)一次甚至更快。

当然,您可以通过完全忽略所有偶数来更快。除了2没有一个是素数的;-)

于 2014-07-25T09:15:43.703 回答
2

如果它到达循环的末尾而没有找到除数,您只需要添加数字。

from math import sqrt

prime = True
for b in xrange(2, sqrt(prime)):
    if prime % b == 0:
        prime = False
        break
if prime:
    primes.append(prime)

注意我添加了一个优化:你只需要测试一个数字的平方根,因为之后的任何东西都不可能除法。

于 2014-07-25T09:05:29.473 回答