解题思路
此题类似于求菲波那契数列,但是无法直接求出求第20190324项的具体数值,long类型甚至BigInteger都存不了这么大的数,题目只要求求后4项,就是暗示我们求解结果只与每项数的后4位有关,故在过程中我们只保留后4位即可
说明:方法1和方法2的区别仅在于数据的存储方式不同,方法1是定义3个整型数来存后三项,方法2是用一个长度为3的整型数组来存储后三项
代码如下:
1)方法1
//方法1:(推荐此方法,容易理解)常规解法
public class C_SeriesSummation {
public static void main(String[] args) {
int a = 1, b = 1, c = 1;
//要是求第四项,则i < 4, 同理可推出求第20190324项,则i < 20190324
for (int i = 3; i < 20190324; i++) {
int temp = (a + b + c) % 10000;
a = b;
b = c;
c = temp;
}
System.out.println(c);
}
}
2)方法2
//方法2:把数存到数组里,可能可以借鉴一下数据循环存储的思想
public class C_SeriesSummation {
public static void main(String[] args) {
int[] arr = {1, 1, 1}; //我们只需要创建长度为3的数组,可以将计算出来的数依次循环存在数组里,最后求出结果,
//例如第4项为前三项结果的和,应该被存在arr[0]里,第5项为数组里三个元素的和,应该被存在arr[1]里...后续的数均按0,1,2,0,1,2...存储
int k= 0, m = 0, n = 0, sum = 0;
for(int i = 4; i < 20190325; i++) { //i代表第i项数,前三项数为1,1,1被存储在数组arr里面,我们就从第4个数开始求,求到第20190324项
k = i % 3; //例如当i=4时,可是数组arr的长度只有3,arr的下标只能是0,1,2,要把计算出来数存储在下标为k=0的位置,即k=i%3
m = (i + 1) % 3;
n = (i + 2) % 3;
sum = (arr[k] + arr[m] + arr[n]) % 10000;
arr[k] = sum;
}
System.out.println(sum); //第i项数就是arr[k],就是sum
}
}