分享一道简单算法题,题目是统计每个月兔子的总数

题目描述如下
    

有一种兔子,从出生后第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);
    }

以上是我的分析与解答,是不是很简单~各位大佬有更好的方法吗?欢迎讨论

猜你喜欢

转载自blog.csdn.net/qq_42490860/article/details/129861885