为什么这不起作用(Python)?

时间:2011-07-26 21:05:05

标签: python primes

所以我正在尝试使用一些教程来学习Python,并且我决定创建自己的练习。我想创建一个脚本来计算1到1000之间有多少素数,以及打印素数。这就是我到目前为止所做的:

numberlist = []
a = 1
prime = True
while a < 1000:
    a = a + 1
    for divisor in range(2,a):
        if a/divisor==int(a/divisor):
            prime=False
        if prime == True:
            print a
            numberlist.append(a)

print "Number of prime numbers between 1 and 1000:", len(numberlist)

但是,当我启动应用程序时,它会返回

“1到1000之间的素数:0:”

我不知道我做错了什么。有人可以澄清我搞砸了什么吗?

感谢您的帮助。

编辑:所以现在代码看起来像这样,但同样的问题正在发生:

numberlist = []

a = 1

for a in xrange(1, 1000):
    for divisor in range(2,a):
        if a % divisor == 0:
           prime=False
        else:
           prime=True
if prime == True:
    print a
    numberlist.append(a)

print "Number of prime numbers between 1 and 1000:", len(numberlist)

5 个答案:

答案 0 :(得分:5)

此代码存在许多问题。首先,a/divisor == int(a/divisor)始终是True,因为Python中的除法是不可变的(您将始终得到整数结果)。请改用a % divisor == 0

另一个问题是prime = True在循环之外,这意味着只要一个值被声明为非素数,就不会有更多值为素数! (prime永远不会在任何地方重新设置True。)

第三个问题,更多的是样式,是首选在python中使用for ... in循环,例如

for a in xrange(1, 1000):
    for divisor in xrange(2, a): ...

编辑:关于修改后的代码:最后的if语句没有缩进,因此不属于for循环。它仅在循环结束后执行一次,这意味着prime将是最后一个值集(其中a999,而不是素数)。您希望将整个if语句缩进到内部for循环中。不过你可以压缩它:

for a in xrange(1, 1000):
    for divisor in xrange(2, a):
        if a % divisor == 0:
            break
    else:
        print a
        numberlist.append(a)

请注意,这使用for ... else子句。将else置于for循环的末尾将导致else块仅在循环未被break中断时才运行。 / p>

作为进一步的评论,在1开始整个循环的列表中会有1,但是1 is not a prime

答案 1 :(得分:3)

a / divisor计算为int,因为a和除数都是整数,所以/ divisor == int(a / divisor)总是为真。尝试检查除法后的余数...模数......我认为在Python中,可能是

  if a % divisor == 0:
     ...

这基本上说“如果除以除数后的余数为零,那么”。

答案 2 :(得分:3)

您永远不会将prime重置为True

答案 3 :(得分:1)

我认为您忘记在每次迭代时将prime的值重置为True

答案 4 :(得分:0)

当你进一步了解有168个素数少于1000时,它可能对你有所帮助。