第十届蓝桥杯大赛软件类省赛 Java 大学 B组 试题C:数列求值

问题描述 

实现代码: 

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是为题解。

题解:2419

发布了120 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq262593421/article/details/104190897