1

这是我的代码:

primes = [2, 3]

while len(primes) != 1001:
    a = primes[-1] + 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes)
        primes.append(a)

print(primes[1002])

这应该创建一个直到第 1001 个素数的列表,然后打印第 1001 个数字。它首先取列表中的最后一个数字并加 2,然后检查给定的数字是否可以被素数列表的任何成员整除。如果它是可整除的,则 for 循环中断并跳过 else 子句。如果不是,则将该数字附加到素数列表中。重复该过程,直到列表的长度为 1001。循环结束后,打印最后一个数字。

但是,输出如下:

[2, 3]
[2, 3, 5]
_

并且在手动执行此操作之前,该程序不会终止。你能告诉我我做错了什么吗?

4

3 回答 3

5

这是因为,在primes[-1] + 2不是素数的情况下,不会更改任何状态(因此程序永远循环)。

更好的方法可能是这样的:

 from itertools import count

 primes = [2, 3]
 for a in count(5, step=2):
     for p in primes:
         if a % p == 0:
             break
     else:
         primes.append(a)
         if len(primes) > 1001:
             break
于 2013-04-14T01:25:55.353 回答
1

a您遇到的第一个非质数a停止增长。这有效:

primes = [2, 3]

a = 3
while len(primes) != 1001:
    a += 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes) # I'm not sure why you'd want to do this
        primes.append(a)

print(primes[1000]) # Note the index: 1000, not 1002
于 2013-04-14T01:34:37.957 回答
0

首先,我会告诫不要在 while 循环中使用 == 和 != ,除非您可以保证会达到标记值。您可能想使用:while len(primes) < 1000:例如。

同样,您需要确保最终会达到循环的退出条件。

另一种选择是使用while True:作为循环头,并在循环内使用 break 进行一些其他处理。(if iteration_count > 1000000 or len(primes > 1000): break ... else iteration_count += 1例如)。

(想象一下,在您的示例中,在素数列表中附加了多个值的错误……即使其余代码正确,它也可能永远循环——数百万个素数之后程序因内存不足而崩溃)。

else:循环子句是 Python 特有的功能。在大多数其他编程语言中,您必须创建一个标记变量并在离开循环后测试其值。将循环中的else:子句视为特定于尝试搜索某物的尝试……而else:是在循环中没有找到合适的项目时执行的代码。

鉴于我不确定您在这里真正想要做什么。

于 2013-04-14T01:35:00.793 回答