2013-02-22 3 views
-1

이 함수는 프로젝트 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()) 

그리고 내 테스트 출력 :

범위 오류 중 인덱스가 storedSums에 액세스하려는 모든 시도에서 오는
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 

[내가] 내가

+0

무엇 "우호적"번호는? – eumiro

+2

@ 우미노 우호적 인 숫자는 다른 숫자와 합이되는 숫자의 쌍입니다. – Volatility

+1

다음과 같이 :'som = sum (list_divisors (i)의 k는 k)'단순히'som = sum (list_divisors (i))'이고'sum (나는 어게 이블에서 i)'단순히'sum (amiables)' . – DSM

답변

3

5040 내가 문제라고 생각된다 여기에 :

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

이것은 som이 < 인 경우에만 목록에 추가됩니다 0, 그렇지 않으면 효과적으로 아무것도하지 않으므로 인덱스 길이 가정은 꺼져 있습니다. 당신이 원하는

[0, 1, 2, 3, 4] 

내 생각 :

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

출력 :

이 테스트 프로그램을 참조하십시오

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

그게 정확히! 고맙습니다! –

+1

또 다른 방법은'storedSums.append (som )'입니다. 하지만 사전을 대신 사용할 수도 있으므로 충분한 공간을 확보 할 필요가 없습니다. – DSM

관련 문제