1

我在秋天开始了一个计算机科学课程,我正在尝试在开始之前建立我的编程能力。

我正在研究 MIT OCW 6.0 问题,第一个是产生第 1000 个素数。显然,我想生成自己的代码,所以我想知道我的逻辑哪里出了问题。

counter = 1
primes = [2]
n = 3
while counter < 1000:
    for i in range(2, n):
        if n % i == 0:
        break
        else:
            primes.append(n)
            counter = counter + 1
    n = n + 1

print primes

你们太棒了,所以我不会在这里解释每一行,但我的逻辑要点是我希望这个循环从 n 开始。如果 n 是素数,则将其添加到列表中并在计数器中添加 1,如果不是则移动到下一个数字。最后,打印列表,以第 1000 个素数结尾。

看,我知道这是“蛮力”,我知道那里有筛子和更复杂的逻辑,但我希望它以这种方式工作。现在,我得到了很多重复的数字,而且没有接近第 1000 个素数。

多谢你们。这是我的第一个问题,但我相信还会有更多问题。

4

2 回答 2

2

你的逻辑是对的,你的块不是。break 应该缩进(在 下if n % i),else 应该不缩进,所以它是 for 循环的 else - 即只有在没有素数是它的因素时才添加数字,而不是每个素数都是它的因素。

counter = 1
primes = [2]
n = 3
while counter < 1000:
    for i in range(2, n):
        if n % i == 0:
           break
    else:
        primes.append(n)
        counter = counter + 1
    n = n + 1

print primes

您可以通过仅将 n 除以(到目前为止的素数列表)而不是所有数字来节省时间 - 只需替换range(2, n)primes

于 2013-06-28T04:27:41.570 回答
0

有几个错误。这是我的代码版本

counter = 1
primes = [2]
n = 3
while counter < 1000:
    flag = 0
    for i in range(2, n):
        if n % i == 0:
            flag = 1
            break
    if flag==0:
        primes.append(n)
        counter = counter + 1
    n = n + 1

print primes

您可以在此处运行 aboce 代码http://codebunk.com/bunk#-Iy8aps3Zy7woREB64VF

编辑:您不需要检查数字从 2 到 n 的可分性。也许将其更改为 2 到 n^0.5

于 2013-06-28T07:11:10.200 回答