【问题标题】:Project Euler 34 Help [Python]Project Euler 34 帮助 [Python]
【发布时间】:2016-03-24 10:35:31
【问题描述】:

问题是:

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 作为答案。我看不出我做错了什么,有人可以帮忙吗?

我并不是要发布欧拉问题的解决方案。

【问题讨论】:

  • 你有一个变量和一个函数同名(final_sum)
  • 好奇的数字是有限的。见Factorion: Upper Bound
  • 欧拉计划的重点是不使用蛮力。
  • 请注意,a)您可以将阶乘表(将 0-9 的阶乘计算到数字列表甚至字典中 -> int,b)提前退出if check_sum &gt; number,c)return check_sum == number ; d) 使用for counter in range(3, 200000)

标签: python


【解决方案1】:

您的阶乘函数不正确,因为它错误地将0! 计算为0。你可以这样修复它:

def factorial(num):
    """Factorial"""
    if num < 2:
        return 1
    ...

然后您的代码将打印40730

PS:你范围内唯一的另一个奇怪的数字是 40585。

【讨论】:

  • 非常感谢!所以我只需要检查最多 50000 的数字吗?
  • 或者他可以使用math.factorial()
  • 我对欧拉计划一无所知;你被禁止使用内置方法吗?此外,还有其他奇怪的数字超过 200,000。
  • @Reti43 我不知道有 math.factorial()。我现在就试试看。
  • 我没有看到任何这样的限制。事实上,我看到很多人选择语言是因为他们的内置功能,例如Python 的任意整数精度。为了澄清我的评论,这只是在解释他的错误之外的另一个建议。重新发明轮子是学习算法的一种很好的方法,以及可能犯的常见错误,例如 OP 所犯的错误。
【解决方案2】:

您不应该为 func 和 var 使用相同的名称。但这不是问题所在。问题是函数阶乘

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())

【讨论】:

  • 是的。我刚刚用 math.factorial() 试过了。我原来的阶乘函数无法计算 0!正确。
  • xrange() 是 python2 函数吗?我用python3
  • Python3 没有 xrange()。在 python3 中你可以使用 range()
【解决方案3】:

您的代码检查 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 始终按循环嵌套深度排序。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多