我用来解决问题92的代码是正确的,但速度太慢了,因此我尝试通过只考虑每个可能排列的一个数字来修改它,有效地将问题的规模从原来的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:
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
multCoeff是我创建的一个方法,基本上相当于len(set(permutations([int(j) for j in str(i)])))
,并且工作得很好。但问题是我得到的结果不正确,看起来我忽略了一些情况,但我真的看不出来是哪些情况。如果有人能指点我方向,我会非常感激。谢谢。