任务是:小于10的素数之和为2 + 3 + 5 + 7 = 17。 找出200万以下的所有素数之和。
我很困惑为什么我的代码给我一个错误的答案1000000000001
。
在这里:
def prime(a):
for i in range(2,a):
if a % i == 0:
return False
break
return True
sum = 2
for n in range(3,2000000,2):
if prime(n):
sum += n
print(sum)
有人可以解释一下这到底是怎么回事吗?
答案 0 :(得分:3)
您从for循环返回还为时过早:
def prime(a):
if a < 2:
return False
if a == 2:
return True
for i in range(2,a):
if a % i == 0:
return False
# should be after checking all numbers
return True # this line
此外,您最多只需要检查sqrt(a)
并排除偶数即可。
import math
# skip even numbers
def prime(a):
if a == 2:
return True
if a % 2 == 0:
return False
n = math.ceil(math.sqrt(a))
for i in range(3, n+1, 2):
if a % i == 0:
return False
return True
答案 1 :(得分:0)
从here复制@MrHIDEn解决方案
def get_primes(n):
m = n+1
numbers = [True] * m
for i in range(2, int(n**0.5 + 1)):
if numbers[i]:
for j in range(i*i, m, i):
numbers[j] = False
primes = []
for i in range(2, m):
if numbers[i]:
primes.append(i)
return primes
primes = get_primes(2000000)
print(sum(primes))
输出
142913828922
参考:Sieve_of_Eratosthenes这种算法更快