项目Euler任务#10 Python错误答案

时间:2019-06-13 08:03:18

标签: python

任务是:小于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)

有人可以解释一下这到底是怎么回事吗?

2 个答案:

答案 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这种算法更快