题目描述如下
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死(真狠啊,光生不死?),问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
示例1
输入:
3
输出:
2
分析过程:
1 1-1
===>第1个月,1只老兔子年龄1月;年龄达3月兔子总数0,新增0,兔子总数:1
2 1-2
===>第2个月,1只老兔子年龄2月;年龄达3月兔子总数0,新增0,兔子总数:1
3 1-3 1-1
===>第3个月,1只老兔子年龄3月;年龄达3月兔子总数1,新增1,兔子总数:2
4 1-4 1-2 1-1
===>第4个月,1只老兔子年龄4月,1只老兔子年龄2月;年龄达3月兔子总数1,新增1,兔子总数:3
5 1-5 1-3 1-2 1-1*2
===>第5个月,1只老兔子年龄5月,1只老兔子年龄3月,1只老兔子年龄2月;年龄达3月兔子总数2,新增2,兔子总数:5
6 1-6 1-4 1-3 1-2*2 1-1*3
==>第6月,总数:8=5+3
7 1-7 1-5 1-4 1-3*2 1-2*3 1-1*5
==>第7月,总数:13=8+5
8 1-8 1-6 1-5 1-4*2 1-4*3 1-3*3 1-2*5 1-1*8
==>第8月,总数:21=13+8
结论:
==>从第3月开始出现规律, 第n月兔子数=第(n-1)月兔子数+第(n-2)月兔子数
所以这题解法可以这样:
假设求第n个月兔子总数,使用变量sum记录进行统计前兔子总数,变量pre来记录上个月的兔子数,第一个月兔子数为1(变量pre第3月开始才会用到),
- 当n<3时,没有新出生的兔子,即返回第一个月的兔子数;
- 当n>=3时,在上个月中pre表示上个月的兔子数,在这个月就表示上上个月兔子数,使用局部变量temp保存,在这个月中统计到的兔子数为(上个月统计到的兔子总数sum)+(上上个月兔子数pre);
- 同时刷新变量pre,把上个月的兔子数temp赋值给pre。
代码如下
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
// 记录上个月的兔子数,第一个月兔子数为1(第3月开始才会用到)
int pre = 1;
// 当月兔子总数
int sum = 1;
if (n <= 2) {
// 前2月没有新出生兔子
System.out.println(sum);
}
//从第3月开始, 第n月兔子数=第(n-1)月兔子数+第(n-2)月兔子数,即上个月兔子总数+上上个月兔子总数
for (int i = 3; i <= n; i++) {
// 记录上个月的兔子总数
int temp = sum;
// pre在上个月表示“上个月的兔子数”,在本月则表示上上个月兔子数
sum += pre;
// 重置上个月的兔子数
pre = temp;
}
System.out.println(sum);
}
以上是我的分析与解答,是不是很简单~各位大佬有更好的方法吗?欢迎讨论