2013-02-22 69 views
-1

這個功能是我爲解決Project Euler Problem 21而開發的嘗試。 評估10000以下所有友好的數字的總和。 我正在使用一個模塊,list_divisors(),我做了它位於另一個文件,應該工作正常。它應該對發生什麼問題沒有影響。友好的號碼功能打破某種程度上

def ami(): 
    storedSums = [0, 0] 
    amiables = [0, 0] 
    for i in range(2, 10000): 
     som = sum(k for k in list_divisors(i)) 
     storedSums.append(som) if som < 10000 else 0 
     for j in range(2, i - 1): 

      #this if statement is the test. It does not do anything except print what is happening. 
      if (i > 5037 and j % 1000 == 0) or i < 10 or (i > 5038 and j > 5020): 
       print("i = {}, j = {}, storedSums[i] = {}, storedSums[j] = {}, \ 
       len(storedSum) = {}".format(i, j, storedSums[i], storedSums[j], len(storedSums))) 

      #The code freezes here at 5040 
      if storedSums[i] == j and storedSums[j] == i: 
       amiables.extend((i, j)) 
    return sum(i for i in amiables) 

print(ami()) 

而我的測試輸出:

i = 4, j = 2, storedSums[i] = 3, storedSums[j] = 3, len(storedSum) = 5 
i = 5, j = 2, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 6 
i = 5, j = 3, storedSums[i] = 6, storedSums[j] = 4, len(storedSum) = 6 
i = 6, j = 2, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 7 
i = 6, j = 3, storedSums[i] = 6, storedSums[j] = 4, len(storedSum) = 7 
i = 6, j = 4, storedSums[i] = 6, storedSums[j] = 3, len(storedSum) = 7 
i = 7, j = 2, storedSums[i] = 8, storedSums[j] = 3, len(storedSum) = 8 
i = 7, j = 3, storedSums[i] = 8, storedSums[j] = 4, len(storedSum) = 8 
i = 7, j = 4, storedSums[i] = 8, storedSums[j] = 3, len(storedSum) = 8 
i = 7, j = 5, storedSums[i] = 8, storedSums[j] = 6, len(storedSum) = 8 
i = 8, j = 2, storedSums[i] = 11, storedSums[j] = 3, len(storedSum) = 9 
i = 8, j = 3, storedSums[i] = 11, storedSums[j] = 4, len(storedSum) = 9 
i = 8, j = 4, storedSums[i] = 11, storedSums[j] = 3, len(storedSum) = 9 
i = 8, j = 5, storedSums[i] = 11, storedSums[j] = 6, len(storedSum) = 9 
i = 8, j = 6, storedSums[i] = 11, storedSums[j] = 6, len(storedSum) = 9 
i = 9, j = 2, storedSums[i] = 4, storedSums[j] = 3, len(storedSum) = 10 
i = 9, j = 3, storedSums[i] = 4, storedSums[j] = 4, len(storedSum) = 10 
i = 9, j = 4, storedSums[i] = 4, storedSums[j] = 3, len(storedSum) = 10 
i = 9, j = 5, storedSums[i] = 4, storedSums[j] = 6, len(storedSum) = 10 
i = 9, j = 6, storedSums[i] = 4, storedSums[j] = 6, len(storedSum) = 10 
i = 9, j = 7, storedSums[i] = 4, storedSums[j] = 8, len(storedSum) = 10 
i = 5038, j = 1000, storedSums[i] = 5052, storedSums[j] = 1140, len(storedSum) = 5039 
i = 5038, j = 2000, storedSums[i] = 5052, storedSums[j] = 2236, len(storedSum) = 5039 
i = 5038, j = 3000, storedSums[i] = 5052, storedSums[j] = 3860, len(storedSum) = 5039 
i = 5038, j = 4000, storedSums[i] = 5052, storedSums[j] = 4268, len(storedSum) = 5039 
i = 5038, j = 5000, storedSums[i] = 5052, storedSums[j] = 5140, len(storedSum) = 5039 
i = 5039, j = 1000, storedSums[i] = 5040, storedSums[j] = 1140, len(storedSum) = 5040 
i = 5039, j = 2000, storedSums[i] = 5040, storedSums[j] = 2236, len(storedSum) = 5040 
i = 5039, j = 3000, storedSums[i] = 5040, storedSums[j] = 3860, len(storedSum) = 5040 
i = 5039, j = 4000, storedSums[i] = 5040, storedSums[j] = 4268, len(storedSum) = 5040 
i = 5039, j = 5000, storedSums[i] = 5040, storedSums[j] = 5140, len(storedSum) = 5040 
i = 5039, j = 5021, storedSums[i] = 5040, storedSums[j] = 5022, len(storedSum) = 5040 
i = 5039, j = 5022, storedSums[i] = 5040, storedSums[j] = 5110, len(storedSum) = 5040 
i = 5039, j = 5023, storedSums[i] = 5040, storedSums[j] = 5024, len(storedSum) = 5040 
i = 5039, j = 5024, storedSums[i] = 5040, storedSums[j] = 5071, len(storedSum) = 5040 
i = 5039, j = 5025, storedSums[i] = 5040, storedSums[j] = 166, len(storedSum) = 5040 
i = 5039, j = 5026, storedSums[i] = 5040, storedSums[j] = 5036, len(storedSum) = 5040 
i = 5039, j = 5027, storedSums[i] = 5040, storedSums[j] = 5039, len(storedSum) = 5040 
i = 5039, j = 5028, storedSums[i] = 5040, storedSums[j] = 5040, len(storedSum) = 5040 
i = 5039, j = 5029, storedSums[i] = 5040, storedSums[j] = 5077, len(storedSum) = 5040 
i = 5039, j = 5030, storedSums[i] = 5040, storedSums[j] = 5038, len(storedSum) = 5040 
i = 5039, j = 5031, storedSums[i] = 5040, storedSums[j] = 5091, len(storedSum) = 5040 
i = 5039, j = 5032, storedSums[i] = 5040, storedSums[j] = 5101, len(storedSum) = 5040 
i = 5039, j = 5033, storedSums[i] = 5040, storedSums[j] = 5041, len(storedSum) = 5040 
i = 5039, j = 5034, storedSums[i] = 5040, storedSums[j] = 5040, len(storedSum) = 5040 
i = 5039, j = 5035, storedSums[i] = 5040, storedSums[j] = 5113, len(storedSum) = 5040 
i = 5039, j = 5036, storedSums[i] = 5040, storedSums[j] = 5039, len(storedSum) = 5040 
i = 5039, j = 5037, storedSums[i] = 5040, storedSums[j] = 5064, len(storedSum) = 5040 
Traceback (most recent call last): 
    File "<string>", line 420, in run_nodebug 
    File "F:\Programming\python\project euler\Amicable numbers.py", line 18, in <module> 
    print(ami()) 
    File "F:\Programming\python\project euler\Amicable numbers.py", line 14, in ami 
    if storedSums[i] == j and storedSums[j] == i: 
IndexError: list index out of range 

該指數超出範圍的錯誤是從任何企圖訪問storedSums未來[I]當我成爲5040

+0

什麼是 「友好」 的數字? – eumiro 2013-02-22 12:49:41

+2

@eumiro友好數字是其因素與其他數字相加的數字對。 – Volatility 2013-02-22 12:50:30

+1

Aside:'som = sum(k in list_divisors(i))'簡單地說就是'som = sum(list_divisors(i))'和'sum(我爲了我在amiables中)'簡單地'sum(amiables)'' 。 – DSM 2013-02-22 13:13:19

回答

3

我認爲這個問題是這裏:

storedSums.append(som) if som < 10000 else 0 

如果som是< 1000這隻會追加一些東西到列表中0,否則它將無效,因此你對索引長度的假設是關閉的。

看到這個測試程序:

test_list = [] 
for i in range(10): 
    test_list.append(i) if i < 5 else 0 
print test_list 

輸出:

[0, 1, 2, 3, 4] 

我想你想要這樣的:

if som < 10000: 
     storedSums.append(som) 
    else: 
     storedSums.append(0) 
+0

就是這樣!謝謝! – 2013-02-22 13:09:13

+1

或者,'storedSums.append(som if som <10000 else 0)'。但是我可能會用字典來代替,所以你不必確保創建足夠的空間。 – DSM 2013-02-22 13:14:53