【问题标题】:Have I checked every consecutive subset of this list?我是否检查了此列表的每个连续子集?
【发布时间】:2026-01-06 08:00:02
【问题描述】:

我正在尝试解决Project Euler 上的问题 50。不要给我答案或为我解决它,只是尝试回答这个具体问题。

我们的目标是找到与一百万以下的素数相加的最长的连续素数之和。我写了一个筛子来找到n以下的所有素数,我已经确认它是正确的。接下来,我将使用以下方法检查每个连续素数子集的总和:

我有一个空列表sums。对于每个素数,我将其添加到sums 中的每个元素并检查新的总和,然后将素数附加到sums

这里是python

primes = allPrimesBelow(1000000)
sums = []
for p in primes:
    for i in range(len(sums)):
        sums[i] += p
        check(sums[i])
    sums.append(p)

我想知道我是否为两个或多个低于一百万的连续素数的总和调用了check()

问题说有一个素数 953,可以写成 21 个连续素数之和,但我没找到。

【问题讨论】:

    标签: python list primes proof


    【解决方案1】:

    您的代码是正确的。我运行了它,它确实生成了数字 953,所以问题可能出在你的素数生成函数上。一百万以下的质数应该有 78498 个 - 你可能想检查一下你是否得到了这个结果。

    也就是说,您的代码将需要很长时间才能运行,因为它会调用 check() 3,080,928,753 次。您可能希望找到一种检查较少总和的方法。由于您要求没有剧透,因此我不会对此进行扩展,但如果您对一般提示感兴趣,请告诉我。

    【讨论】:

    • 原来问题在于我没有在此处发布的过早优化。非常感谢运行我的代码,这很有帮助。
    • @interjay 你怎么知道它会调用 check() 3,080,928,753 次?公式是什么?
    • @Nathan:连续的素数序列可以由一对素数定义:它的第一个和最后一个元素。所以我们需要知道有多少对素数。在 N 个元素中,有 N(N-1)/2 对。在这种情况下,N=78498。获得相同答案的另一种方法:计算内循环的迭代次数:0+1+2+...+(N-1) = N(N-1)/2
    【解决方案2】:

    我没有直接的答案,但是您是否尝试过将总和放入嵌套数组,然后将素数 p 附加到子数组而不是将它们添加到求和计数器?这将让您直观地检查哪些素数被添加到每个子数组中,并通过扩展告诉您原始代码总结了哪些素数。

    【讨论】:

    • 你可以,但这是我不需要的额外调试信息,代价是做更多的计算
    最近更新 更多