簡體   English   中英

項目歐拉#23錯誤的答案

[英]Project Euler #23 Incorrect Answer

我剛剛完成了項目euler問題編號23的解決方案,其中指出:

完美數字是一個數字,其正確除數的總和恰好等於數字。 例如,28的適當除數之和為1 + 2 + 4 + 7 + 14 = 28,這意味着28是一個完美數。

如果n的適當除數之和小於n,則數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 生成器幾乎返回整數的所有重要除數,但不保證順序。 它遍歷n到1的平方根並產生除數及其商。 下一個函數is_abundant實際檢查n的除數之是否小於n然后返回False,否則返回True。 接下來是列表abundants ,它包含從1到28123的所有豐富數字,而abundants_set就像abundants但它不是一個列表。 下一個函數是is_abundant_**sum** ,它幾乎檢查給函數的總和本身是否豐富,最后打印出不是is_abundant_sum的數字之和。

我哪里做錯了? 我的代碼中有什么問題?

任何幫助,將不勝感激。

divisors發生器雙倍計算f**2的因子f 此錯誤會影響計算的大量數字列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM