我想编写一个代码,要求三个数字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
- 它要求用户输入三个整数 dig1、dig2、dig3
- 它询问一个数字 N ≥ 3,这将是整个序列计数。
- 它打印一个以
然后打印序列,从三个前导整数开始,然后是遵循前三个整数定义的模式的 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]
只给我最终的输出。我正在尝试遍历每个数字。
对不起,如果不清楚,但任何帮助都会很棒,谢谢。
您的System.out.println(array[i]);
似乎不在 for 循环中。 那么i
将等于n
.并且在长度为n
的数组中没有索引n
的元素。元素从0
到n-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 中的数组具有比实际存储桶数少1 的最高可寻址索引。 因此,如果您打算只打印最终元素,请使用以下命令:
System.out.println(array[i-1]);
或
System.out.println(array[n-1]);
在第n=scrn.nextInt()
行中,您正在从scrn
中分配一个整数n
,但您不知道该整数的值。
然后有了这个:
int[] array = new int[n];
数组的大小为 n 个元素,从索引0到索引n-1。
因此,假设您用.nextInt()
影响n的值低于3:i的初始值,甚至不会达到循环,因为您将在这里超出界限:
array[0] = dig1;
array[1] = dig2;
array[2] = dig3;
因为您将尝试在不存在的索引处影响数组上的值(n 不如 3,但您试图影响大小为n的数组中的三个值(。
然后,如果 n 优于3,因为您的打印代码已从循环中输出,则 i的值等于 n,并且在索引n处没有值.请记住,只有当条件i<n
为 false 时,循环才会离开,并且要达到该条件,i必须相等或更高,这将导致打印时出现 IndexOutOfBoundsException。
我认为您打印的行代码应该在for
循环内。