用python生成素数:我的逻辑怎么会错

用python生成素数:我的逻辑怎么会错,python,logic,primes,Python,Logic,Primes,我将在秋天开始一个计算机科学项目,我正在尝试在开始之前建立我的编程技能 我正在讨论麻省理工学院开放式课程6.0的问题,第一个是产生第1000个素数。显然,我想生成自己的代码,所以我想知道我的逻辑哪里出了问题 counter = 1 primes = [2] n = 3 while counter < 1000: for i in range(2, n): if n % i == 0: break else: p

我将在秋天开始一个计算机科学项目,我正在尝试在开始之前建立我的编程技能

我正在讨论麻省理工学院开放式课程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
计数器=1
素数=[2]
n=3
当计数器<1000时:
对于范围(2,n)内的i:
如果n%i==0:
打破
其他:
素数追加(n)
计数器=计数器+1
n=n+1
打印素数
你们太棒了,所以我不会在这里解释每一行,但我的逻辑要点是,我希望这个循环从n开始。如果n是素数,则将其添加到列表中,并将1添加到计数器中,如果不是,则转到下一个数字。最后,打印列表,以第1000个素数结尾

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


谢谢各位。这是我的第一个问题,但我相信还会有更多的问题出现。

你的逻辑是正确的,你的模块不是。中断应该缩进(在
下,如果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
计数器=1
素数=[2]
n=3
当计数器<1000时:
对于范围(2,n)内的i:
如果n%i==0:
打破
其他:
素数追加(n)
计数器=计数器+1
n=n+1
打印素数

只需将n除以(到目前为止的素数列表),而不是所有数字,即可节省时间-只需将
范围(2,n)
替换为
素数

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

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
计数器=1
素数=[2]
n=3
当计数器<1000时:
标志=0
对于范围(2,n)内的i:
如果n%i==0:
标志=1
打破
如果标志==0:
素数追加(n)
计数器=计数器+1
n=n+1
打印素数
你可以在这里运行aboce代码


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

你的缩进有问题。
else
子句在哪里?我认为“break”应该是缩进的。提示:几乎总是使用而不是
range()
@JonathonReinhart For python 2(这个问题使用的是)我鄙视python中的
For
构造。@JonathonReinhart有什么特别的原因吗?这是一种简洁的方法,通常需要一个额外的变量或函数。@Amber,因为他们使用了
else
关键字,在这里他们应该引入另一个关键字<代码>用于。。。而且,这对我来说更有意义。仅仅是阅读它,我几乎总是从它的实际工作方式中得到相反的结果(
else
执行iff
for
正常完成)。@Amber我喜欢这个概念,只是讨厌这个关键字。它与与与
if
关联的
else
完全不同。在那里,
else
主体仅在
if
主体未执行时执行。在我阅读
for..else
之前,我假设
else
只在
for
从未执行过一次的情况下才执行。我自己并不经常使用它,但当我处理其他人的代码时,我倾向于应用最小的合理更改来解决问题。(我的)那条规则适用于这种情况。谢谢。很高兴知道我的逻辑不是问题所在。你为什么选择丢旗?“你为什么选择丢旗?”-我不明白你在说什么。我应该说,“你为什么选择用旗?”来表示我内环没有自然结束,而是我打破了它,也就是说,我找到了一个除以n的数字