项目欧拉#23错误的答案

时间:2014-08-24 18:42:30

标签: python algorithm python-3.x

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

  

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

     

如果正确的除数之和为,则数字n称为不足   小于n,如果此总和超过n,则称为丰富。

     

由于12是最小的数,1 + 2 + 3 + 4 + 6 = 16,所以   最小的数字,可以写成两个丰富数字的总和   通过数学分析,可以显示所有整数   大于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 生成器几乎返回整数的所有重要除数,但不保证顺序。它循环遍历 n 的1到平方根,并产生除数及其商。下一个函数is_abundant实际检查 n 的除数之和是否小于n然后返回False,否则返回True。接下来是列表abundants,其中包含从1到28123的所有大量数字,而abundants_set就像abundants一样,但它不是列表的集合。下一个函数是is_abundant_**sum**,它几​​乎检查给函数的总和本身是否丰富,最后打印出不是is_abundant_sum的数字之和。

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

divisors生成器重复计算f的因子f**2。此错误会影响计算的大量数字列表。