问题描述
实现代码:
package com.gxwz.lanqiaobei;
import java.util.Arrays;
/**
* 试题C:数列求值
* @author com
*/
public class Sequence {
public static void main(String[] args) {
core();
}
public static void core() {
// 使用 a b c d 轮询数组
int a = 0,b = 1,c = 2,d = 3;
// 初始化数组
int[] A = new int[4];
// 前三位赋值
A[0] = 1; A[1] = 1; A[2] = 1;
// 执行201902324-3次
int n = 4,max = 100000;
while(n <= 201902324) {
// 根据n与4取模数实现数组 环形累加
//
if(n % 4 == 0) {
if(A[a]+A[b]+A[c] > max) {
A[d] = (A[a]+A[b]+A[c])%10000;
}else {
A[d] = A[a]+A[b]+A[c];
}
}else if(n % 4 == 1) {
if(A[b]+A[c]+A[d] > max) {
A[a] = (A[b]+A[c]+A[d])%10000;
}else {
A[a] = A[b]+A[c]+A[d];
}
}else if(n % 4 == 2) {
if(A[a]+A[c]+A[d] > max) {
A[b] = (A[a]+A[c]+A[d])%10000;
}else {
A[b] = A[a]+A[c]+A[d];
}
}else {
if(A[a]+A[b]+A[d] > max) {
A[c] = (A[a]+A[b]+A[d])%10000;
}else {
A[c] = A[a]+A[b]+A[d];
}
}
// 根据最后两次累加之后数组的值判断最后被添加的数值即为第201902324项
if(n == 201902324 - 1) {
System.out.println(Arrays.toString(A));
}if(n == 201902324) {
System.out.println(Arrays.toString(A));
}
}
System.out.println(n);
System.out.println(Arrays.toString(A));
}
}
运行结果:
[21441, 39313, 71665, 10911]
[21441, 39313, 71665, 2419]
201902325
[21441, 39313, 71665, 2419]
结题思路:
一开始是想直接new一个201902324长度的数组,但是考虑到性能所以就使用环形数组
环形数组:根据题意可知从第三项之后,接下来的每一项均等于前三项的和,所以只需创建一个长度为4的二维数组
然后在循环时通过判断n与4取环形累加二维数组,实现数组的环形累加。由于最终的数值过大,而且题目要求只需要
取最后结果的后四位。一旦每次数值超过四位通过与10000取模可得后四位值。最后,因为取后四位和环形数组的缘故
并不能直接判断出最终值是哪一个,所以最后打印出最后两次数组累加之后的值便可判断2419是为题解。