【发布时间】: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