Project Euler 34 Help [Python]



问题是:

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总是按照循环嵌套深度进行排序。

最新更新