Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 欧拉92项目_Python_Math - Fatal编程技术网

Python 欧拉92项目

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

我的求解代码是正确的,但速度太慢,因此我试图修改它,对该数字的每个可能排列只考虑一个数字,有效地将问题的大小从原来的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
导入时间
从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。