任何人都可以告诉我为什么在for循环的每次迭代中都会达到print语句,即使条件没有达到?
from math import *
def sumOfPrimes():
divisor = 2
for n in range(2, 100):
if n % divisor != 0 and n != divisor:
divisor += 1
if divisor == n:
print (n, divisor)
divisor = 2
else:
divisor = 2
答案 0 :(得分:2)
让我们看看数字3。 除数仍为2.
(n % divisor != 0 and n != divisor) = (3 % 2 != 0 and 3 != 2) = True
divisor += 1 (divisor is now 3.)
(divisor == n) = (3 == 3) = true
print (n, divisor) = print(3,3)
现在排在第4位:
(n % divisor != 0 and n != divisor) = (4 % 3 != 0 and 4 != 3) = True
divisor += 1 (divisor is now 4.)
(divisor == n) = (4 == 4) = true
print (n, divisor) = print(4,4)
等等。 这就是for循环的每次迭代都达到print语句的原因。
如果你想计算从2到100的素数之和,你可以使用另一个循环与另一个var,从2到sqrt(n)运行,并检查这些数字是否可以被任何一个分割。通过这种方式,您可以确定数字是否为素数,并且仅为总和添加素数。
from math import *
def sumOfPrimes(Number):
Sum = 0
for n in range(2, Number+1): #range doesnt count the last number so I added 1 to Number.
if sqrt(n)<2: Sum += n;
else:
prime = True;
for i in range(2, int(sqrt(n))+1): #range takes only int, the +1 is like the previous one.
if n % i == 0:
prime = False; #the number is not prime.
if prime: Sum+=n; print n;
return Sum;
print sumOfPrimes(100);
答案 1 :(得分:2)
if n % divisor != 0 and n != divisor:
如果n % divisor != 0
不是 n的除数,则 divisor
为真。例如,如果divisor
为2且n
为3,则为真。在第一次循环之后的每次迭代中,这将触发,因为divisor
将为n-1
}。
divisor += 1
在第一次循环之后的循环的每次迭代中,divisor
将在此行之前n-1
并且紧随其后n
。我不知道你为什么要这样做。
if divisor == n:
这是真的,所以
print (n, divisor)
这将会发生。
答案 2 :(得分:1)
你是 - 我无意中想象 - 将两个不同的东西重用名为n
的变量。一个是函数的参数,另一个是循环变量:
def sumOfPrimes(n):
...
for n in range(2, int(sqrt(n))):
...
您需要确定哪个是哪个,并通过在整个代码中重命名其中一个来将它们分开。