【问题标题】:Incorrect output Project Euler #50不正确的输出 Project Euler #50
【发布时间】:2018-11-01 18:51:07
【问题描述】:

Project Euler 问题 50 内容如下:

素数41,可以写成六个连续素数之和:

41 = 2 + 3 + 5 + 7 + 11 + 13 这是与小于 100 的素数相加的最长连续素数之和。

加到一个素数上的小于一千的连续素数的最长和,包含 21 项,等于 953。

100 万以下的哪个素数可以写成最连续素数之和?

在我的方法中,我使用 Eratosthenes 筛预生成素数列表,然后 在函数本身中,我不断添加素数列表的后续元素 每次我这样做时,我都会检查总和本身是否是素数,如果是,我会跟踪它作为最大的一个并返回它。我猜这应该可行吗?显然答案是不正确的,但有趣的是,当我改变筛子以生成低于 100000 的素数时,它不会给出索引错误,而是给出另一个结果。

from algorithms import gen_primes

primes = [i for i in gen_primes(1000000)]


def main(n):
    idx, total, maximum = 0, 0, 0
    while total < n:
        total += primes[idx]
        idx += 1
        if total in primes:
            maximum = total
    return maximum


print(main(1000000))

【问题讨论】:

  • 当上限为 1000 时,您的代码会产生 953 吗?
  • 嗯......是你的计算循环有问题,还是你的素数列表有问题?
  • 它输出 281,但如果上限为 100,它会给出正确的结果
  • @Prune 我多次使用素数算法,所以我认为它工作正常
  • 当你得到解决方案时,请记得给有用的东西投票并接受你最喜欢的答案(即使你必须自己写),这样 Stack Overflow 才能正确存档问题。跨度>

标签: python debugging math


【解决方案1】:

您的程序不能解决一般问题:您总是从最低的2 开始您的连续素数列表。因此,您返回的是从 2* 开始的最长连续列表,而不是 任何 个连续的素数列表。

简而言之,你需要另一个循环...

start_idx = 0
while start_idx < len(primes) and best_len*primes[start_idx] < n:
    # find longest list starting at primes[start_idx]
    start_idx += 1

如果有任何帮助,成功的序列从 1500 到 2000 之间开始。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多