【问题标题】:Project Euler #23 Incorrect AnswerProject Euler #23 错误答案
【发布时间】:2014-08-24 18:42:29
【问题描述】:

我刚刚完成了对项目 euler 问题编号 23 的解决方案,其中指出:

一个完美数是一个数,它的真因数之和 正好等于数字。例如,适当的总和 28 的除数将是 1 + 2 + 4 + 7 + 14 = 28,这意味着 28 是一个完美的数字。

如果一个数 n 的真因数之和为 小于n,如果这个总和超过n,则称为丰富。

因为 12 是最小的丰度数,1 + 2 + 3 + 4 + 6 = 16,所以 可以写成两个丰富数之和的最小数 是 24。通过数学分析,可以证明所有的整数 大于 28123 可以写成两个丰富数之和。 然而,这个上限不能通过分析进一步降低 即使已知最大的数是不可能的 表示为两个丰富数之和小于此限制。

求所有不能写成的正整数之和 两个丰富数之和。

这是我的解决方案:

from math import sqrt
def divisors(n):
    for i in range(2, 1 + int(sqrt(n))):
        if n % i == 0:
            yield i
            yield n / i

def is_abundant(n):
    return 1 + sum(divisors(n)) > n

abundants = [x for x in range(1, 28123 + 1) if is_abundant(x)]
abundants_set = set(abundants)

def is_abundant_sum(n):
   for i in abundants:
       if i > n:  # assume "abundants" is ordered
         return False
       if (n - i) in abundants_set:
           return True
   return False

sum_of_non_abundants = sum(x for x in range(1, 28123 + 1) if not is_abundant_sum(x))
print(sum_of_non_abundants)

我的答案是:3906313

我的代码解释: divisors generator 几乎返回整数的所有非平凡除数,但不保证顺序。它通过 1 循环到 n 的平方根并产生除数及其商。下一个函数is_abundant 实际上检查 n 的除数之和是否小于 n 然后返回 False 否则返回 True。接下来是列表abundants,它包含从1到28123的所有丰富数字,abundants_set就像abundants一样,但它是一个集合而不是一个列表。下一个函数是is_abundant_**sum**,它几乎可以检查赋予函数的总和本身是否丰富,最后打印不是is_abundant_sum 的数字的总和。

我哪里做错了?我的代码有什么问题?

任何帮助将不胜感激。

【问题讨论】:

  • 你的问题是你的除数函数
  • @PadraicCunningham 有什么问题?
  • 如果你在除数函数中添加总和并返回那里然后调用它,忘记 is_abundant

标签: python algorithm python-3.x


【解决方案1】:

divisors 生成器对 f 的因子 f**2 进行双重计算。此错误会影响计算出的丰富数字列表。

【讨论】:

  • 没看懂,能详细点吗?
  • @MohammadAreebSiddiqui 例如,list(divisors(4)) 的计算结果为 [2, 2],导致 4 被错误地视为丰富。
  • 那么我应该将得到的除数减半吗? :P
  • @MohammadAreebSiddiqui:不;只是不要计算平方整数的平方根两次。
  • @MohammadAreebSiddiqui 最简单的解决方法是仅在大于 i 时产生 n / i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
相关资源
最近更新 更多