数列求值
问题:给定数列 1,1,1,3,5,9,17,····,从第4项开始,每项都是前三项的和。求第 20190324 项的最后4位数字。
思路:
- 刚开始看这道题的时候我以为和斐波那契数列那样直接递归就完了,结果写出来报了个栈内存溢出异常,我查了一下,是递归太多次的问题,递归这条路走不通。
- 递归不行的话,我想着用个循环遍历试试吧,就写出了下面的代码1。这时我的想法是这样的:弄个while循环,弄个指针变量,然后弄个数一遍遍更改。最后判断一下倒数第四位是不是0。结果做出来和答案不一样,我把N=1 --> N=9试了一遍,发现没问题。想了很久不知道为什么,查了别人的答案才知道,第20190324项的数太长了,溢出了,要对数处理,所以我改了一下代码测试,发现可以。但是我的代码写的太多太丑了,我觉得问题很大。
- 我没想出来好的解答方案,看了别人的答案。最主要的就是把数变短,做法就是每一项都对10000区域,将每一项的大小都限制在10000以内,这道题输出的是后四位,所以没有影响。代码2是我更改后的答案,可以直接输出满足题目要求的数。思路还是窄啊。
代码1:
public class 数列求值 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int index = 1;
int num1 = 0;
int num2 = 0;
int num3 = 0;
int value = 0;
while (index <= n) {
if (index == 1 ) {
num1 = 1;
value = 1;
index++;
continue;
} else if (index == 2) {
num2 = 1;
value = 2;
index++;
continue;
} else if (index == 3) {
num3 = 1;
value = 3;
index++;
continue;
}
int m = num1 + num2 + num3;
num1 = num2;
num2 = num3;
num3 = m;
value = m;
index++;
}
String s = Integer.toString(value);
if (s.substring(s.length() - 4,s.length() - 3).equals("0")) {
System.out.println(s.substring(s.length() - 3,s.length()));
} else {
System.out.println(s.substring(s.length() - 4,s.length()));
}
}
}
代码2:
public class 数列求值 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int a = 1, b = 1, c = 1; //定义三个辅助变量,表示第一、第二、第三个数
int val = 0; //最后的值
if (n == 1 || n == 2 || n == 3) { //n=1,2,3时项的值为1
val = 1;
}
for (int i = 4; i <= n; i++) {
val = (a + b + c) % 10000; //每个项的值都对10000取余,限制项的大小低于10000
a = b;
b = c;
c = val;
}
if (val / 1000 == 0) { //判断千位是否为0
System.out.println(val % 1000);
} else {
System.out.println(val);
}
}
}