0

对于 46348 的 int 输入值之后给出的以下代码,我得到了ArrayIndexOutOfBoundsException。我在for循环中获得了保持数组限制的条件。但不知何故,我得到了这个例外,我无法弄清楚。我的要求是找到给定数字以下的所有素数。

 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++)

如果i是 46349 那么j也变成 46349。如果用46349乘以46349,得到2148229801,大于2147483647,所以整数溢出,变成-2146737495。自然地,它小于 46349,因此for-loop 中的检查通过。但是你不能在 Java 中索引一个负值的数组,这就是你得到ArrayIndexOutOfBoundsException.

范围检查您的输入值n < 46340,或者如果它确实需要与n = 46349输入一起使用,请切换到long数据类型,这将适用于n = 3037000499.

于 2012-06-26T07:16:40.993 回答
0

46349 * 46349 太大,不能用作 Java 数组的索引。索引只是一个 32 位有符号整数,因此最大值为 2,147,483,648。

It passes the < n check because it overflows and comes back negative, so it is in fact less than n, but a negative number is not a legal array index.

于 2012-06-26T07:16:46.463 回答