我想编写一个代码,要求输入三个数字dig(1),dig(2),dig(3)并显示一个数字序列dig(1),dig(2),dig(3)等。 ..,按照以下规则进行dig(n):
- a = dig(2)-dig(1)
- b = dig(3)-dig(2)
- dig(n)= dig(n-1)+ a,如果n为奇数
- dig(n)= dig(n-1)+ b,如果n为偶数
示例:
7、8、5、6、3、4、1、2,-1、0
然后打印序列,从三个前导整数开始,后面跟随前三个整数定义的模式的N-3个其他术语。有关更多信息,请参见下面的示例。
(序列以n = 1开头,但是数组当然从0开始。)
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int a;
int b;
int n = 0;
int i;
dig1 = scnr.nextInt();
dig2 = scnr.nextInt();
dig3 = scnr.nextInt();
n = scnr.nextInt();
int[] array = new int[n];
array[0] = dig1;
array[1] = dig2;
array[2] = dig3;
a = dig2 - dig1;
b = dig3 - dig2;
for (i = 3; i < n; i++){
if(i%2 == 0){
array[i] = b + array[i-1];
}
else{
array[i] = a + array[i-1];
}
}
System.out.println(array[i]);
}
}
每当我尝试打印出来时,都会出现此错误:
java.lang.ArrayIndexOutOfBoundsException
另一个例子:如果在输入中输入数字0 1 0 9
,我应该收到序列0 1 0 1 0 1 0 1 0
打印array[n-1]
仅返回最终输出。我正在尝试遍历每个数字。
很抱歉,如果不清楚,谢谢您。
答案 0 :(得分:3)
您的System.out.println(array[i]);
似乎不在for循环中。然后i
将等于n
。并且数组长度为n
中没有索引为n
的元素。元素从0
到n-1
。
答案 1 :(得分:1)
起初,我认为您选择的数组大小小于3,并且在数组初始化期间代码在此处失败:
array[0] = dig1;
array[1] = dig2;
array[2] = dig3;
但是现在,我实际上认为代码的最后一行是问题所在。仔细看看您的for
循环:
for (i=3; i < n; i++) {
if (i % 2 == 0) {
array[i] = b + array[i-1];
}
else {
array[i] = a + array[i-1];
}
}
System.out.println(array[i]);
请注意,在for
循环结束时,循环计数器i
将始终为数组大小的n
。访问array[n]
总是超出范围,因为Java中的数组的可寻址索引最高,比实际存储桶数少 。因此,如果您打算只打印最后一个元素,请使用以下命令:
System.out.println(array[i-1]);
或
System.out.println(array[n-1]);
答案 2 :(得分:0)
在行n=scrn.nextInt()
上,您正在向n
分配一个scrn
中的整数,但是您不知道该整数的值。
然后用这个:
int[] array = new int[n];
您的数组的大小为n个元素,从索引 0 到索引 n-1 。
因此,假设您用.nextInt()
影响到 n 的值不及 3 : i 的初始值循环甚至不会到达,因为您将在这里超出范围:
array[0] = dig1;
array[1] = dig2;
array[2] = dig3;
因为您将尝试影响不存在的索引处的数组上的值( n 次于三个,但您尝试影响大小为 n )。
如果 n 优于 3 ,因为您的打印代码不在循环中,因此 i < / strong>等于 n ,索引 n 没有任何值。请记住,只有条件i<n
为假,并且达到该条件 i 必须等于或高于该条件,并且在打印时会导致IndexOutOfBoundsException,循环才会离开。
我认为您打印行代码应该在for
循环内。