我正在制作一个 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)
您的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)