>>> k=1
>>> sum=0
>>> for i in range (2,10):
for j in range (2,i):
if ((i%j)==0):
k=0
if (k==1):
sum+=i
>>> print(sum)
5
我不知道为什么,但是这段代码,而不是给出17作为输出,总是给出5。
答案 0 :(得分:4)
每次k
循环移动到下一个数字时,您需要将1
标记设置回for i
:
for i in range (2,10):
k = 1
for j in range (2,i):
if ((i%j)==0):
k=0
if (k==1):
sum+=i
如果不这样做,您的代码只会发现5
为素数,并在此之后忽略任何内容。
请注意,在Python中,0在布尔上下文中使用时被视为 false (例如if
语句),1为真,因此您只需使用{{1} }。更好的是,使用if k:
和True
以及更好的变量名称,例如False
而不是is_prime
。你可以放下很多这些括号:
k
我还利用了这样一个事实:你只需要检查一个数字的平方根,看看是否有除数,显着减少了循环。
最后但并非最不重要的是,您可以使用sum = 0
for num in range (2, 10):
is_prime = True
for i in range (2, int(num ** 0.5) + 1):
if not num % i:
is_prime = False
if is_prime:
sum += num
构造;如果在for ... else
循环中使用break
,则for
分支永远不会被执行,但如果else
循环完成而没有突破,则是;这消除了对布尔标志的需要:
for
答案 1 :(得分:0)
在@Martijn Pieters的回答中注明了问题,您可以在sum
中使用generator expression:
>>> sum(i for i in range(2,10) if all(i%j!=0 for j in range(2,i)))
17
答案 2 :(得分:0)
sum=0
limit=10
for n in range(2,limit+1):
if all(n % i for i in range(2, n)):
sum += n
print sum
Output: 17