2017-02-18 43 views
1
>>> def lcm(a,b): 
    if a<<b: 
     c=a 
     a=b 
     b=c 
    c=0 
    lit=[a,b,c] 
    n=3 
    while (not lit[n%3]%lit[(n%3)+1]==0): 
     lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1] 
     if lit[(n%3)+2]==0: 
      d=lit[(n%3)+2] 
      print d 
     else: 
      n=n+1 

這是代碼,試圖構建函數lcm,該函數找到a和b的最小公倍數。並不是真正的最乾淨的代碼,但遺憾的是這是我所能做的。如果這個代碼塊可能會更輕一點,那真的會很好。問:列表分配索引超出範圍

所以,呃,回到正題,我要求lcm,它只是脫口而出錯誤信息。

這是它說:

>>> lcm(78696,19332) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    lcm(78696,19332) 
    File "<pyshell#1>", line 10, in lcm 
    lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1] 
IndexError: list assignment index out of range 

Aaaaand我有完全不知道我現在該怎麼辦。
我現在可以做什麼?

+0

[捕捉異常](https://docs.python.org/2.7/tutorial/errors.html#handling-exceptions )和除了套件外,打印''''''和''len(點亮)'''。我很確定這個錯誤是說你正在試圖給一個不存在的''''''''''指定一個值,就像'''len(lit)'''是2,你是試着做'''點亮[4] ='foo'''' – wwii

+0

對我來說,如果一個名爲''n_mod3''的變量用於所有這些下標,我的眼睛會更容易 - 它可以被計算兩次,一次在循環之前,另一次當'''n'''變化時。 – wwii

回答

0

n%3可大如2.因此n%3 + 1可能不亞於3名單​​3210只有3項,所以在這條線,

lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1] 

如果n%3 == 2,然後訪問點亮[(n%3)+1]將導致索引超出範圍錯誤。

+0

ohhhhhhhhhh謝謝。 –

0

Python列表爲零索引。

因此點亮[0] = a,點亮[1] = b,點亮[2] = c。

lit[(n%3)+2]=lit[n%3]%lit[(n%3)+1] 

如果n = 1,則(N%3)2等於3,如果n = 2,則(N%3)2等於4。

如果要保證你'在一個有效的索引處訪問你的列表,然後你想按列表的長度列出你正在做的,只是不在正確的位置。

沒有看太深入你的代碼,我認爲這只是操作順序的另一個教訓。嘗試(n + 2)%3而不是(n%3)+2。

x%3將始終在範圍[0,2]內 - 所以這就是爲什麼你想在最後修改。 (x%3 + n結束於[n,2 + n]範圍內。)

相關問題