问题是:
145是一个奇怪的数字,如1!+4!+5!=1+24+120=145。
求所有数字的和,这些数字等于其数字的阶乘和。
注:as 1!=1和2!=2不是总和,它们不包括在内。
# Project Euler Problem 34
def factorial(num):
"""Factorial"""
product = num
for i in range(2, num):
product *= i
return product
def check_sum(number):
list_digits = list(str(number))
check_sum = 0
for digit in list_digits:
check_sum += factorial(int(digit))
if check_sum == number:
return True
def find_final_sum():
"""Find the sum of all the numbers."""
final_list = []
final_sum = 0
counter = 3
while counter < 200000:
if check_sum(counter):
final_list.append(counter)
counter += 1
else:
counter += 1
for j in final_list:
final_sum += j
print(final_sum)
find_final_sum()
我定义了一个函数来寻找阶乘。然后我定义了一个函数来检查一个数字是否等于其数字的阶乘之和。最后,我检查了3到200000之间的数字。如果一个数字有效,我会把它放在一个列表中。最后,我总结了这份清单并打印出来
这个代码只给我145作为答案。我看不出我做错了什么,有人能帮忙吗?
我不是想发布欧拉问题的解决方案。
您的阶乘函数不正确,因为它错误地将0!
计算为0
。你可以这样修复:
def factorial(num):
"""Factorial"""
if num < 2:
return 1
...
则您的代码将打印CCD_ 3。
PS:你范围内唯一一个奇怪的数字是40585。
函数和变量不应该使用相同的名称。但这不是问题所在。问题是函数阶乘
import math
def check_sum(number):
list_digits = list(str(number))
check_sum = sum([math.factorial(int(digit)) for digit in list_digits])
return check_sum == number
def final_sum(counter_min=3, counter_max=200000):
"""Find the sum of all the numbers."""
final_sum = 0
for counter in xrange(counter_min, counter_max):
if check_sum(counter):
final_sum += counter
return final_sum
if __name__ == '__main__':
print(final_sum())
您的代码检查145、154、415、451、514和541。这意味着你计算相同的阶乘和6次。这种重复会随着数字的增加而增加。试着只计算唯一的数字组合,并测试总和是否按任何顺序包含这些数字。
import math
def compare_digits( val, arr, nesting_depth ):
digits = [int(d) for d in str(val)]
digits.sort()
return arr[0:sz] == digits
f = [math.factorial(i) for i in range(10)]
idx = [ 0,0,0,0,0,0,0 ]
for idx[0] in range(10):
for idx[1] in range(idx[0], 10):
sum = f[idx[0]] + f[idx[1]]
if compare_digits( sum, idx, 2 ):
total += sum
for idx[2] in range(idx[1], 10):
sum = f[idx[0]] + f[idx[1]] + f[idx[2]]
if compare_digits( sum, idx, 3 ):
total += sum
# for idx[3] etc.
请注意,数组idx总是按照循环嵌套深度进行排序。