0

次の問題に遭遇しました。1 から N までのすべての素数を取得して出力するクラスがあります。N は、自分で挿入する必要があるパラメーターです。N に 10000 を挿入すると、コードが機能し、2 から N に最も近い素数までのすべての素数が出力されます。

40000 を挿入すると、コードは引き続き機能します。50000 (またはそれ以上) を挿入すると、コードは ArrayOutOfBoundsException を返します。なんで?

これは私が使用するコードです:

  ArrayList<Integer> priemGetallen = priemGetallen(n);
        for (Integer i : priemGetallen) {
              System.out.println(i);
        }

そして用途

ArrayList<Integer> priemgetallen = new ArrayList<Integer>();

for(int i = 2; i < n; i++){
    priemgetallen.add(i);
}

for (int i = 2; i < n; i++) {
    for (int j = i; j * i <= n; j++) {
      if((j*i) < priemgetallen.size()){
          priemgetallen.remove(j*i);
        }
        }
   }
   return priemgetallen;
  }

ポイント「priemgetallen.remove(j*i)」は、エラーが発生する場所です。

誰かが、これがすべての N の約よりも大きい場合に機能しない理由を教えていただければ、本当に感謝しています。40000。

前もって感謝します!

4

1 に答える 1

4

Java が保持できる最大値intは 2,147,483,647 であるため、46,341に達するj * iとオーバーフローします。ij

i範囲を広げるには、jとのタイプを に変更しnますlong

Java は整数のアンダーフローとオーバーフローをどのように処理し、どのようにチェックしますか? を参照してください。

PS また、ではなくpriemgetallenの配列リストに変更する必要があります。LongInteger

于 2014-10-21T15:35:36.757 に答える