我正在解决Euler项目问题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,然后给出:
Traceback (most recent call last):
File "solution.py", line 10, in <module>
sumFact=functools.reduce(lambda x, y: factDict[x]+factDict[y], listNum)
File "solution.py", line 10, in <lambda>
sumFact=functools.reduce(lambda x, y: factDict[x]+factDict[y], listNum)
KeyError: 25
我也打印了列表,发现那里没有问题。
我要去哪里错了?
您使用不functools.reduce()
正确。
这:functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)
应用于[1,4,0]将(尝试)计算:
factDict[factDict[1] + factDict[4]] + factDict[0]
导致该索引错误(factDict [1] + factDict [4]等于25)。
根据文档:
左边的参数x是累加值
因此,如果您使用factDict [x],您将用其阶乘(而不是您想要的)替换累计值。
因此,您必须将x保留为“单独”。
然后,要初始化为“中性”,您可以只使用0,这样,它将实际计算(对于140): 0 + factDict[1] + factDict[4] + factDict[0]
所以最后:
#!/usr/bin/env python3
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, 0)
if(sumFact == i):
print("Found: " + str(i))
此外,我更改了最后一个测试,sumFact == i
因为您要查找等于其阶乘之和的数字,而不是其阶乘之和的除数。(如评论中所述,您可以使用自己喜欢的测试)。
PS这不会产生很多结果:
$ ./test_script.py
1000000
Found: 145
Found: 40585
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句