0

46348 の int 入力値の後の以下のコードについては、取得してArrayIndexOutOfBoundsExceptionいます。配列の制限を維持するforループでCondition が与えられます。しかし、どういうわけか私はこの例外を受け取っており、それを理解することができません。そして、私の要件は、指定された数より下のすべての素数を見つけることです。

 Scanner sc = new Scanner(System.in);
    int n= sc.nextInt();
    int[] arr= new int[n+1];
            for(int i=2;i<=n;i++)
            {
                if(arr[i]==0)
                {
                    for(j=i;j*i<=n;j++)
                        arr[j*i]=1; // Here i am getting Exception
                }
            }

入力:

46349

出力:

java.lang.ArrayIndexOutOfBoundsException: -2146737495

502802

ありがとう。、

4

2 に答える 2

3

算術オーバーフローが発生しました。

Java では、intデータ型は 32 ビットの符号付き整数です。つまり、-2147483648 から 2147483647 までの値を持つことができます。

この行で:

for(j=i;j*i<=n;j++)

i46349ならj46349 にもなります。46349 に 46349 を掛けると、2148229801 になり、これは 2147483647 より大きいため、整数はオーバーフローして -2146737495 になります。当然、46349 未満なので、ループ内のチェックはforパスします。しかし、Java では負の値で配列にインデックスを付けることはできませんArrayIndexOutOfBoundsException

の入力値の範囲をチェックするか、入力をn < 46340実際に処理する必要がある場合は、データ型にn = 46349切り替えます。longn = 3037000499

于 2012-06-26T07:16:40.993 に答える
0

46349 * 46349 は Java 配列のインデックスとして使用するには大きすぎます。インデックスは 32 ビットの符号付き整数であるため、最大値は 2,147,483,648 です。

オーバーフローして負の値が返されるため、< n チェックに合格します。したがって、実際には n 未満ですが、負の数は有効な配列インデックスではありません。

于 2012-06-26T07:16:46.463 に答える