使用Python投影Euler#27

使用Python投影Euler#27,python,python-2.7,Python,Python 2.7,让我有点困惑 以下是我认为正确的解决方案: import math start = time.time() def check_prime(a, b, n): num = n**2 + a * n + b mod = 3 if num >= 0: check = int(math.sqrt(num)) else: return False while mod <= check: if num %

让我有点困惑

以下是我认为正确的解决方案:

import math
start = time.time()
def check_prime(a, b, n):
    num = n**2 + a * n + b
    mod = 3
    if num >= 0:
        check = int(math.sqrt(num))
    else:
        return False
    while mod <= check:
        if num % mod == 0:
            return False
        mod += 2
    return True
def main():
    n = 0
    max_n = 0
    for a in xrange(-1000, 1000):
        for b in xrange(-1000, 1000):
            while check_prime(a, b, n):
                n += 1
                if n > max_n:
                    max_n = n
                    product = a * b
        n = 0
    print max_n, product
    print time.time() - start
if __name__ == '__main__':
    main()
导入数学
开始=时间。时间()
def检查(a、b、n):
num=n**2+a*n+b
mod=3
如果num>=0:
check=int(math.sqrt(num))
其他:
返回错误
而mod max\n:
最大值n=n
产品=a*b
n=0
打印最大值,产品
打印时间。时间()-开始
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
这给了我一个连续的376个素数列表,其中实际的列表只有71个。我想我只是理解这个问题有困难。最长的素数列表不是必须至少是80吗,因为这是一个例子?我的程序计算71个列表的两个项的乘积,但它一直上升到376

这个问题中有什么我忽略了的吗

最长的素数列表不是必须至少是80吗,因为这是一个例子

问题陈述中给出的公式是
n²79n+1601
,因此
a=79
b=1601>1000
。因此,您不应该期望连续素数的数量大于80。事实上,71是正确的连续素数。现在,您只需要确保您的
产品
是正确的

提示:

a*b
的值为负值


快速看一下,我看到了
for
循环边界中的一个错误。您在外部循环中重置了
n
。我很确定你想在内部循环中这样做,或者重构你的代码,这样你就不需要那些容易出错的计数器变量了。我将
n=0
移动到内部循环,它工作得很好,节省了3秒的时间。谢谢,伙计。还要注意的是,当a=0、b=0和n=2x时,check_prime函数确实返回True,或者基本上每次n2+a*n+b是的幂时都返回True2@Josh这到底是怎么解决的?与其编辑标题以添加“[已解决]”,不如提交自己的答案(并接受它)。是的,我没有给予足够的关注,忽略了1601显然大于1000的事实。谢谢你。