首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Project Euler任务#10 Python错误答案

Project Euler任务#10 Python错误答案
EN

Stack Overflow用户
提问于 2019-06-13 16:03:19
回答 2查看 91关注 0票数 0

任务Project Euler #10是: 10以下素数的和是2+3+5+7= 17。找出两百万以下所有素数的和。

我被为什么我的代码给我一个错误的1000000000001答案弄糊涂了。这就是它:

代码语言:javascript
复制
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)

有人能给我解释一下它到底出了什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2019-06-13 16:08:13

您从for循环返回得太早了:

代码语言:javascript
复制
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)和排除偶数。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2019-06-13 17:06:49

here复制@MrHIDEn解决方案

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
142913828922

参考:Sieve_of_Eratosthenes此算法速度更快

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56575967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档