2014-01-19 34 views
0

我無法得到正確的輸出如下:邏輯錯誤項目euler 23?

一個完美的編號是針對其適當除數的總和正好等於號。例如,28的適當因數的和將是1 + 2 + 4 + 7 + 14 = 28,這意味着28是一個完美的數字。

如果n的合適除數之和小於n,則n稱爲不足,如果和超過n,則稱n爲大數。

由於12是最小的豐富數字,1 + 2 + 3 + 4 + 6 = 16,可以寫成兩個豐富數字之和的最小數字是24.通過數學分析,可以看出所有大於28123的整數都可以寫成兩個豐富數字的總和。然而,即使知道不能表示爲兩個豐富數的總和的最大數小於該極限,也不能通過分析進一步減少該上限。

查找所有不能寫成兩個豐富數字之和的正整數的和。

def check(n): 
    s=0 
    for i in xrange(1,n/2+1): 
    if n%i==0: 
     s+=i 
    return s>n 
l=100 
sieve=[True]*l 
for i in xrange(12): 
    sieve[i]=False 

abundant=[] 
for i in xrange(12,l): 
    if check(i): 
    abundant.append(i) 

for i in xrange(len(abundant)-1): 
    for j in xrange(i+1,len(abundant)): 
    if abundant[i]+abundant[j]<l: 
     if sieve[abundant[i]+abundant[j]]==True: 
     sieve[abundant[i]+abundant[j]]=False 
     print abundant[i]+abundant[j] 

print sum([i for i in xrange(len(sieve)) if sieve[i]]) 
+3

如果您正在尋找助您檢查碼(正確或不正確),[代碼審查(http://codereview.stackexchange.com)可能比StackOverflow更好。同時,這個問題上有數百個Python發佈的答案;你有沒有搜索過他們,並閱讀他們,看看你在做什麼不同?最後,你做了什麼來調試你的代碼,比如'打印'中間值來查看它是否出錯了? – abarnert

+0

@abarnert在CodeReview上關閉此問題:「您的問題必須包含工作代碼,供我們在此處查看。」 – stewSquared

回答

1

正確的解決辦法,根據this4179871

這裏是你怎麼想修復您的代碼:

def check(n): 
    s=0 
    for i in xrange(1,n/2+1): 
    if n%i==0: 
     s+=i 
    return s>n 

l=28123 # upper bound of a number that is not the sum of 2 abundant numbers 
sieve=[False]*l # sieve[i] == True means i IS the sum of 2 abundant numbers 

abundant=[] 
for i in xrange(12,l): 
    if check(i): 
    abundant.append(i) 

for i in xrange(len(abundant)): # ranges here are such that you don't forget something like 2*abundant[-1] 
    for j in xrange(i,len(abundant)): 
    if abundant[i]+abundant[j]<l: 
     sieve[abundant[i]+abundant[j]]=True 

print sum([i for i in xrange(len(sieve)) if not(sieve[i])]) 
+0

是的,我是測試與l = 100但28123我仍然沒有得到答案我得到4179805 ...如果你能幫助這個!謝謝 – vvv

+0

@ ankit.dhall我上面張貼的代碼打印'4179871'。你的價值是'66'。那恰好是'1 + 2 ... + 10 + 11'。如果你看我的回答,你會看到我初始化'sieve = [False] * l',而在你的問題中,你把'1'的條目翻到'11' ... – Lmis

+0

很酷的得到了..謝謝! – vvv