所以我正在尝试使用一些教程来学习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)
答案 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
将是最后一个值集(其中a
是999
,而不是素数)。您希望将整个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时,它可能对你有所帮助。