Python 欧拉92项目
我的求解代码是正确的,但速度太慢,因此我试图修改它,对该数字的每个可能排列只考虑一个数字,有效地将问题的大小从原来的1000万减少到11439。这是我的密码Python 欧拉92项目,python,math,Python,Math,我的求解代码是正确的,但速度太慢,因此我试图修改它,对该数字的每个可能排列只考虑一个数字,有效地将问题的大小从原来的1000万减少到11439。这是我的密码 import time from Euler import multCoeff start = time.time() def newNum(n): return sum([int(dig)**2 for dig in str(n)]) def chain(n, l): if n in l: retur
import time
from Euler import multCoeff
start = time.time()
def newNum(n):
return sum([int(dig)**2 for dig in str(n)])
def chain(n, l):
if n in l:
return n, l
else:
l.append(n)
return chain(newNum(n), l)
nums = []
for i in range(1,10000000):
if all(str(i)[j] <= str(i)[j+1] for j in range(len(str(i))-1)):
nums.append(i)
count = 0
for i in nums:
if 89 in chain(i,[])[1]:
perms = multCoeff(i)
count += perms
end = time.time() - start
print count, end
导入时间
从Euler导入multCoeff
开始=时间。时间()
def newNum(n):
返回和([int(dig)**2用于dig in str(n)])
def链(n,l):
如果n在l中:
返回n,l
其他:
l、 附加(n)
返回链(新数量(n),l)
nums=[]
对于范围内的i(110000000):
如果all(str(i)[j]我们缺少multCoeff
的代码,那么我在这里猜测
您正试图通过排除没有升序数字的数字,然后在之后重新计算它们的排列,从1到99999999进行筛选
您的问题是0
根据您的过滤器,2、20、200、2000、20000、200000、2000000
都由2
表示,但是您可能没有添加这么多排列
关于代码的一般观察:
- 列表中的
项具有O(n)
;尽量避免对大型列表执行此操作
- 您正在丢弃许多计算的结果;链中任何导致
89
或1
的数字都将始终具有该最终结果
- 每个函数调用都有时间开销;尽量减少循环调用中的函数数量
- 将
str
转换为int
有点贵;请尽量将转换次数保持在最低限度
我的程序确实没有计算所有这些排列,我必须考虑到这一点。也感谢您的其他建议!您担心将链的数量减少到本质上不同的数字,但将具有相同数字平方和的数字合并在一起要快得多。最大平方和其中的数字是567,有495个可能的值。只需记住其中哪一个指向89,哪一个指向1。