我在解决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}$我也打印了清单,发现没有问题。在
我哪里出错了?在
reduce方法无法按您的预期工作。访问https://docs.python.org/2/library/functions.html#reduce
在这个表达式中,x是累积值,y是iterable(listNum)的更新值。 发生异常时,listNum的值为[1,4,0]。此时,reduce函数的计算结果为:
^{pr2}$纠正这种情况的一种方法是像这样在reduce函数中设置一个初始值设定项。在
请注意,此代码将显示由这些数字的阶乘和除以的数字。在
您没有正确使用
functools.reduce()
。在应用于[1,4,0]的:
functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)
将(尝试)计算:导致索引错误(factDict[1]+factDict[4]等于25)。在
根据to the doc:
因此,如果使用factDict[x],您将用它的阶乘(而不是您想要的)替换累积值。在
所以你必须让x单独呆着。在
然后,要初始化为“中性”的东西,您可以使用0,这样,它将实际计算(对于140):
0 + factDict[1] + factDict[4] + factDict[0]
最后:
^{pr2}$此外,我更改了
sumFact == i
中的最后一个测试,因为您要寻找的数字等于它们的阶乘之和,而不是它们的阶乘之和的除数。(如评论中所述,你可以使用你喜欢的测试)。在PS这不会给出很多结果:
相关问题 更多 >
编程相关推荐