我正在尝试使用此代码用整数填充数组:

    int[] steps = new int[1000001];
    steps[0] = 0;
    steps[1] = 1;
    steps[2] = 2;

    for(int i = 1001; i < steps.length; i++){
        if(steps[i]==0){
             steps[i] = steps[i-1]+1;
        }
        int current = i;

        for(int m = current; m > 1; m--){
            int mult = current*m;
            if(mult<steps.length){
                int suma = steps[current]+1;
                if(steps[mult]==0){
                    steps[mult] = suma;
                }
                if(suma<steps[mult]){
                    steps[mult] = suma;
                }
            }
        }
    }

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();

    for(int k = 0; k < n; k++){

        int q = scan.nextInt();
        System.out.println(steps[q]);

    }

    scan.close();


我得到这个:


  线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:-2147479015
      在javaapplication6.JavaApplication6.main(JavaApplication6.java:26)
  C:\ Users \ User \ AppData \ Local \ NetBeans \ Cache \ 8.2 \ executor-snippets \ run.xml:53:Java返回:1
  生成失败(总时间:1秒)


但是我不明白为什么会这样。我了解当您尝试访问不存在的索引时会发生这样的异常。我已经检查了很多次我的代码,但找不到问题。

你知道这个数字是什么意思吗?因为这使我感到困惑:


  线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:-2147479015


NetBeans说问题出在:


  javaapplication6.JavaApplication6.main(JavaApplication6.java:26)


第26行是这样的:

if(steps[mult]==0)


我认为这是在某个时候程序正在尝试访问数组的不存在的索引。问题是我不明白在这里怎么发生。

为了避免这种情况,我将这一行放在前面,但这似乎行不通:

if(mult<steps.length)


然后,我通过将其更改为这一行来对其进行修改,它似乎可以正常工作。它不再显示异常:

if(mult<steps.length && mult >=0)


现在的问题是,显然,它没有进入代码的这一部分:

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    for(int k = 0; k < n; k++){
        int q = scan.nextInt();
        System.out.println(steps[q]);
    }

    scan.close();


我想首先理解为什么发生该异常,为什么通过添加代码的另一部分来“解决”该异常,其次,为什么我的代码似乎陷入我的第一个for循环中。

如果您能帮助我理解那些事情,我将不胜感激。

提前致谢。

最佳答案

在您的代码中

int mult = current*m;


其中currentmsteps数组的大小

因此1000001 * 1000001将超过数组的大小,并且还将超过最大int值

我不确定您想通过做什么逻辑

if(steps[mult]==0){


您的问题可以用此代码显示

int val = 1000000;

for (int i = 0; i < 100; i++) {
     val = val * val;
     if (val < 0) {
         System.out.println(val);
     }
}

09-26 05:15
查看更多