我正在尝试使用以下代码用整数填充数组:
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();
我得到了这个:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2147479015 at javaapplication6.JavaApplication6.main(JavaApplication6.java:26) C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 BUILD FAILED (total time: 1 second)
但我不明白为什么会发生这种情况。据我所知,当您尝试访问不存在的索引时,会发生此类异常。我已经检查了很多次我的代码,但一直无法找到问题所在。
你知道这个数字是什么意思吗?因为这让我感到困惑:
Exception in thread "main" 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);
}
}
关于java - 我试图通过迭代用整数填充数组,但出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724238/