2017-03-03 50 views
1

此代碼是用Python 3編寫的。我試圖找到10001的素數。爲什麼函數在Python中返回錯誤「列表索引超出範圍」?

#10001st prime number 
mylist=[] 
def prime_index(n): 
    for i in range(99**99): 
     for x in range(2, int(i**1/2)): 
      if i % x == 0: 
       return False 
      return True 
      mylist.append(i) 
     n=int(n+1) 
     print(mylist[n]) 
     break 
prime_index(10001) 

當我運行,它說:「列表索引超出範圍」,指的是print(mylist[n])。 但是,我一直在mylist.append(i)的路上添加素數。那麼有人可以告訴我這裏有什麼問題,因爲我不明白髮生了什麼。 99 ** 99是否太小?或者更細微的代碼問題?

+2

我認爲當'print()'執行時''n的值會讓你感到驚訝。將一些調試打印語句添加到您的代碼中以確定執行時發生了什麼;用這種方法你可以看你的代碼運行。特別是,在執行print()之前打印出'n'的值,以便您可以看到代碼嘗試顯示的數組中的索引。 – jefe2000

+2

現在你的代碼在mylist的長度爲0時第一次到達違規行。 –

+0

'range(99 ** 99)'產生一個與mylist無關的數字列表。 – DyZ

回答

3

99**99不是太小;如果你真的打印出來了,那麼你已經超出了你的需要(如果你試圖運行它,你永遠不會完成,這是657位工作)。但是你的循環毫無意義;如果它執行一次,您的內循環將立即返回TrueFalse

對你來說「幸運」,它永遠不會執行一次。第一個外部循環第一次將i設置爲0,因此內部循環根本不運行(側面注意,您可能想要i ** (1/2),而不是i ** 1/2;指數優先於分割)。因爲它沒有運行,所以最終將索引到一個空列表中(並且索引10001的索引不低於)。

這段代碼中存在太多的問題來解決它們;尋找其他試驗部門主要發現代碼來了解它應該是什麼樣子。

1

問題是,當您找到(或不)第一個素數時,您嘗試打印出10001st元素。此外,請注意,如果您沒有找到任何素數,那麼您從例程中返回,如果您想要獲得那麼多。沒有辦法達到附加聲明。

你得只是因爲你的第一次迭代中得到的具有i = 0 打印聲明,這樣你就不會爲循環進入可言。

請按照發布指南:花時間研究如何生成素數。它可以比你做的快得多,並會給你一個很好的,簡潔的代碼放入你的程序。

+0

非常感謝大家,我現在已經解決了! –