我對這個太常見的歐拉專案問題表示歉意,但我真的很困惑,我得到的這個值是怎么來的。我已經找到了一個可以作業的實作,所以我不是在尋找一個修復方法,而是在尋找一個解釋,為什么我在最后得到這個數字。我所指的問題是這個。它要求找出所有不能寫成兩個豐富數字之和的正整數之和。下面是我的代碼:
from math import sqrt
import itertools
def primeFactors(n)。
# Returns dictionary with number of each prime divisor.
primes = {}
count = 0.
while n % 2 == 0:
count = 1 1
n = n / 2: count = 1.
if count > 0:
primes[2] = count
for i in range(3, int(sqrt(n)) 1, 2)。)
while n % i == 0:
if i not in primes:
primes[i] = 1
else: primes[i] = 1
n = n / i
if n > 2:
if n not in primes:
primes[n] = 1
else: primes[n] = 1
return primes
def SumProper(n)。
# 輸出n的適當因子之和。
x=1
for key,value in primeFactors(n).items()。
x *= (key**(value 1) - 1) / (key - 1)
y = x - n
return int(y)
x = set(range(1,28124)
abundant = {i for i in range(1, 14062) if SumProper(i)> i}
AbSums = {i j for i, j in itertools.product( abundant, repeat=2)}。
y = x.difference(AbSums)
print(sum(y))
我一直得到的答案是31531501,而正確的解決方案是4179871。在測驗時,我的所有函式似乎都能正常作業,但經過一番實驗,我發現我似乎在14,000大關之后開始少算了大量的數字。我不知道為什么。如果有人能解釋一下這個錯誤在哪里,以及31531501這個數字是如何產生的,我將非常感激。謝謝!
P.S. 我知道現階段的代碼可能不是最佳的,但我目前的目標是了解錯誤的起源,我可以在以后努力優化它。
uj5u.com熱心網友回復:
改變這一行:
abundant = {i for i in range(1, 28124) if SumProper(i) > i}
給出了你參考的正確答案。
問題是你的帖子中沒有包含的邏輯錯誤,但在代碼中隱含了這個問題。問題陳述是要找到所有不能寫成兩個豐富數字之和的正整數之和。你被告知所有高于N=28123的整數都可以被寫成兩個整數之和。然后代碼假設這意味著N = 28123以上的所有整數都可以寫成兩個豐度數之和,每個豐度數最多為N/2,這是不正確的。
這就是說,當你明確處理整數和可分性時,使用浮點除法和乘法,一旦你的四舍五入誤差過大,似乎是一個災難的秘訣。然而,這些并不是造成這個錯誤的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/319962.html
標籤:
上一篇:用一個小方塊移動一個div
