问题是:
145是一个奇怪的数字,为1! + 4! + 5! = 1 + 24 + 120 = 145。
求所有数字的总和等于其数字的阶乘之和。
注意:为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 :(得分:1)
您的阶乘函数不正确,因为它错误地将0!
计算为0
。你可以像这样解决它:
def factorial(num):
"""Factorial"""
if num < 2:
return 1
...
然后您的代码将打印40730
。
PS:你范围内唯一的其他好奇数字是40585。
答案 1 :(得分:1)
你不应该为func和var使用相同的名称。但那不是问题。问题是函数factorial
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())
答案 2 :(得分:0)
您的代码检查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始终按向循环嵌套深度排序。