对于int输入值46348之后的给定以下代码,我得到了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

谢谢。,

最佳答案

您遇到了算术溢出。

在Java中,int数据类型是32位有符号整数,这意味着它可以具有-2147483648和2147483647之间的值。

在这行上:

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


如果i为46349,则j也变为46349。如果将46349乘以46349,则得到2148229801,该值大于2147483647,因此整数溢出并变为-2146737495。自然,它小于46349,因此for循环中的检查通过。但是您无法在Java中为具有负值的数组建立索引,这就是为什么得到ArrayIndexOutOfBoundsException的原因。

范围检查n < 46340的输入值,或者如果确实需要使用n = 46349输入,请切换到long数据类型,该数据类型最多可以使用n = 3037000499

07-24 22:11