python质数总和

kyl*_*e k 1 python primes sum

我正在制作一个 python 程序,该程序将生成一个数字的素数之和,但该程序没有给出正确的结果,请告诉我原因。

b=1
#generates a list of numbers.
while b<100:
    b=b+1
    x = 0.0
    a = 0
    d = 0
    #generates a list of numbers less than b. 
    while x<b:
        x=x+1
        #this will check for divisors. 
        if (b/x)-int(b/x) == 0.0:
            a=a+1
        if a==2:
            #if it finds a prime it will add it.
            d=d+b
print d 
Run Code Online (Sandbox Code Playgroud)

我让它成功生成了一个素数列表,但我无法添加素数。

这是我用来生成素数列表的代码。

b=1
while b<1000:
    b=b+1
    n = b
    x = 0.0
    a = 0
    while x<n:
        x=x+1
        if (n/x)-int(n/x) == 0.0:
            a=a+1
    if a==2:
        print b
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 5

您的d变量在外循环的每次迭代中都会被重置。将初始化移出该循环。

此外,a == 2外循环的每次迭代只应进行一次检查。将其移出内循环。

b=1
d = 0
#generates a list of numbers.
while b<100:
    b=b+1
    x = 0.0
    a = 0
    #generates a list of numbers less than b. 
    while x<b:
        x=x+1
        #this will check for divisors. 
        if (b/x)-int(b/x) == 0.0:
            a=a+1
    if a==2:
        #if it finds a prime it will add it.
        d=d+b
print d 
Run Code Online (Sandbox Code Playgroud)

结果:

1060
Run Code Online (Sandbox Code Playgroud)

在此期间,让我们尝试清理代码,使其更易于理解。你可以把内循环移到它自己的函数中,这样读者可以更清楚地了解它的用途:

def is_prime(b):
    x = 0.0
    a = 0
    while x<b:
        x=x+1
        #this will check for divisors. 
        if (b/x)-int(b/x) == 0.0:
            a=a+1
    if a==2:
        return True
    else:
        return False

b=1
d=0
#generates a list of numbers.
while b<100:
    b=b+1
    if is_prime(b):
        d=d+b
print d
Run Code Online (Sandbox Code Playgroud)

使用变量名来描述它们所代表的内容也很有用:

def is_prime(number):
    candidate_factor = 0
    amount_of_factors = 0
    while candidate_factor<number:
        #A += B is equivalent to A = A + B
        candidate_factor += 1
        #A little easier way of testing whether one number divides another evenly
        if number % candidate_factor == 0:
            amount_of_factors += 1
    if amount_of_factors == 2:
        return True
    else:
        return False

number=1
prime_total=0
#generates a list of numbers.
while number<100:
    number += 1
    if is_prime(number):
        prime_total += number
print prime_total
Run Code Online (Sandbox Code Playgroud)

for循环比while增加计数器的循环更具有惯用性:

def is_prime(number):
    amount_of_factors = 0
    for candidate_factor in range(1, number+1):
        if number % candidate_factor == 0:
            amount_of_factors += 1
    if amount_of_factors == 2:
        return True
    else:
        return False

prime_total=0
#generates a list of numbers.
for number in range(2, 101):
    if is_prime(number):
        prime_total += number
print prime_total
Run Code Online (Sandbox Code Playgroud)

如果你觉得很大胆,你可以使用列表推导来减少你使用的循环次数:

def is_prime(number):
    factors = [candidate_factor for candidate_factor in range(1, number+1) if number % candidate_factor == 0]
    return len(factors) == 2

#generates a list of numbers.
primes = [number for number in range(2, 101) if is_prime(number)]
prime_total = sum(primes)
print prime_total
Run Code Online (Sandbox Code Playgroud)