用数学序列填充数组

时间:2018-10-25 08:19:59

标签: java arrays

我想编写一个代码,要求输入三个数字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]仅返回最终输出。我正在尝试遍历每个数字。

很抱歉,如果不清楚,谢谢您。

3 个答案:

答案 0 :(得分:3)

您的System.out.println(array[i]);似乎不在for循环中。然后i将等于n。并且数组长度为n中没有索引为n的元素。元素从0n-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循环内。