2017-03-03 3 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ステートメントをコードに追加して、実行時に何が起こっているかを判断します。このようにして、コード実行を監視することができます。特に、print()が実行される直前に 'n 'の値を出力して、コードが表示しようとしている配列のインデックスを確認することができます。 – jefe2000

+2

'mylist'の長さが0のままで初めて、あなたのコードが違反行になります。 –

+0

' range(99 ** 99) 'は' mylist'とは関係のない数字のリストを生成します。 – DyZ

答えて

3

99**99はあまり小さくありません。もしあなたが実際にそれを印刷するなら、あなたはあなたが必要とするものを十分に超えています(あなたがそれを実行しようとすると、決して終わらないでしょう、それは657ビットの仕事です)。しかし、あなたのループは意味をなさない。一度でも実行されると、内部ループはTrueまたはFalseのいずれかを直ちに返します。

「幸いにも」あなたにとっては、一度も実行されません。最初の外側ループはiを最初に0に設定するので、内側ループはまったく実行されません(サイドノートでは、i ** 1/2ではなくi ** (1/2)が必要ですが、べき乗は除算よりも優先されます)。実行されないため、空のリストにインデックスを作成してしまいます(インデックス10001以下を求めます)。

このコードでは、すべての問題に対処するにはあまりにも多くの問題があります。それがどのように見えるべきかのアイデアを得るために、他の試行部門プライム発見コードを探してください。

1

問題は、最初のプライムが見つかるとすぐに10001st要素を印刷しようとしていることです。また、素数を見つけることなくルーチンから戻ることに注意してください。 という文を追加する方法はありません。

あなたは全くのループを入力しないように、あなたの最初の繰り返しは、I = 0があるという理由だけで印刷ステートメントになりました。

投稿のガイドラインに従ってください。素数を生成する方法を研究する時間を取ってください。それはあなたがやっているよりもはるかに高速にすることができ、あなたのプログラムに入れる素敵な、簡潔なコードを与えるでしょう。

+0

ありがとう、私は今それを解決しました! –

関連する問題