欧拉问题27如下:
欧拉发现了显著的二次公式:
N平方+N+41
结果表明,这个公式将为
连续值n=0到39。然而,当n=402+40+41时=
40(40+1)+41可以被41整除,当然当n=41,41平方+
41+41显然可以被41整除。
我们发现了令人难以置信的公式n79n+1601,它产生了
连续值n=0到79的80个素数产品的
系数-79和1601为-126479。
考虑到形式的求积:
N_+A+B,其中A式中n是n的模量/绝对值,例如11=11和−4|=
4求二次型系数a和b的乘积
连续生成素数的最大数的表达式
n的值,从n=0开始。
这就是我的解决方案:

from math import sqrt, fabs

def eSieve(rnge):
    rootedrange = int(sqrt(rnge))
    mydict = dict([(_, True) for _ in range(2, rootedrange)])
    for i in range(2, rootedrange):
        if mydict[i] == True:
            for j in range(i**2, rnge, i):
                mydict[j] = False
    mylist = []
    for key in mydict.keys():
        if mydict[key] is True:
            mylist.append(key)
    return mylist

primes = eSieve(87400)

def isPrime(n):
    i = 0
    while primes[i] <= n:
        if primes[i] == n: return True
        i+=1
    return False

arange = 0
brange = 0
nrange = 0
for a in range(-1000, 1001):
    for b in range(-1000, 1001):
        n = 0
        formula = n*n + a*n + b
        print(formula)
        while(isPrime(fabs(formula))):
            n+=1

        if n > nrange:
            arange = a
            brange = b
            crange = c

print(arange * brange)

我不知道为什么它不断地抛出这个错误:
Traceback (most recent call last):
  File "D:\Programming\ProjectEuler\p27.py", line 33, in <module>
    while(isPrime(fabs(formula))):
  File "D:\Programming\ProjectEuler\p27.py", line 20, in isPrime
    while primes[i] <= n:
IndexError: list index out of range

有谁能告诉我的程序是如何超出列表范围的?这很不正常为什么会这样?

最佳答案

如果你想知道1000000是否是素数,我们来看看会发生什么:

i = 0
while primes[i] <= n:
    if primes[i] == n: return True
    i+=1

return False

没有一个筛选的素数大于1000000,因此您的while条件永远无法满足。python的第一条规则是永远不要使用while循环(除非您不能使用任何其他循环)。在这里,您可以轻松地用for替换它:
for i in primes:
    if i == n:
        return True

return False

但这正是in运算符要替换的:
return n in primes

除了重新实现Python核心特性之外
isPrime随着项目数的增加而变慢。
因此,对于键入最少的最快代码,您可以执行以下操作:
>>> primes = eSieve(87400)
>>> prime_set = set(primes)
>>> 13 in prime_set
True
>>> # or if you want a function:
>>> is_prime = prime_set.__contains__
>>> is_prime(13)
True

n in primes如果给定值在item in list中,则item in set的magic方法返回true-直接使用它比在函数中包装__contains__运算符快得多。

关于python - 欧拉计划#27 Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25344612/

10-13 01:18