打印间隔中的所有素数

时间:2013-12-27 11:05:06

标签: python

任何人都可以告诉我为什么在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

3 个答案:

答案 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))):
        ...

您需要确定哪个是哪个,并通过在整个代码中重命名其中一个来将它们分开。