我正在尝试使用此代码用整数填充数组:
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;
其中
current
和m
是steps
数组的大小因此
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);
}
}