我的代码给出了超过极限的关键错误

2024-04-26 21:21:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在解决Euler项目problem 34

我的代码如下:

import functools

limit = int(input())

factDict = { 0:1, 1:1, 2:2, 3:6, 4:24, 5:120, 6:720, 7:5040, 8:40320, 9:362880 }

for i in range(10, limit):
    listNum = list(map(int, list(str(i))))
    #print(listNum)
    sumFact = functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)
    if(sumFact%i == 0):
        print(i)

它在140分钟前工作正常,然后给出:

^{pr2}$

我也打印了清单,发现没有问题。在

我哪里出错了?在


Tags: 项目代码inimportforinputlistint
2条回答

reduce方法无法按您的预期工作。访问https://docs.python.org/2/library/functions.html#reduce

sumFact = functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum).

在这个表达式中,x是累积值,y是iterable(listNum)的更新值。 发生异常时,listNum的值为[1,4,0]。此时,reduce函数的计算结果为:

^{pr2}$

纠正这种情况的一种方法是像这样在reduce函数中设置一个初始值设定项。在

import functools
limit = int(input())
factDict = { 0:1, 1:1, 2:2, 3:6, 4:24, 5:120, 6:720, 7:5040, 8:40320, 9:362880 }

for i in range(10, limit):
    listNum = list(map(int, list(str(i))))
    #print(listNum)
    sumFact = functools.reduce(lambda x, y: x + factDict[y], listNum[1:len(listNum)],factDict[listNum[0]])
    #print sumFact
    if(sumFact%i == 0):
        print(i) 

请注意,此代码将显示由这些数字的阶乘和除以的数字。在

您没有正确使用functools.reduce()。在

应用于[1,4,0]的:functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)将(尝试)计算:

factDict[factDict[1] + factDict[4]] + factDict[0]

导致索引错误(factDict[1]+factDict[4]等于25)。在

根据to the doc

The left argument, x, is the accumulated value

因此,如果使用factDict[x],您将用它的阶乘(而不是您想要的)替换累积值。在

所以你必须让x单独呆着。在

然后,要初始化为“中性”的东西,您可以使用0,这样,它将实际计算(对于140):0 + factDict[1] + factDict[4] + factDict[0]

最后:

^{pr2}$

此外,我更改了sumFact == i中的最后一个测试,因为您要寻找的数字等于它们的阶乘之和,而不是它们的阶乘之和的除数。(如评论中所述,你可以使用你喜欢的测试)。在

PS这不会给出很多结果:

$ ./test_script.py
1000000
Found: 145
Found: 40585

相关问题 更多 >