top1编程
← 返回题目
题解

【入门】统计每个月兔子的总数

1 条题解

  • 0
    @ 2026-7-31 12:06:37

    解题思路

    有一对兔子,从第 3 个月起每个月生一对兔子,新兔子长到第 3 个月又开始生。求第 n 个月的兔子总数。

    这是一个经典的斐波那契数列问题。

    规律:

    • 第 1 个月:1 对
    • 第 2 个月:1 对
    • 第 3 个月:2 对(原来 1 对 + 新生 1 对)
    • 第 4 个月:3 对
    • 第 5 个月:5 对
    • ……

    从第 3 个月开始,每月的对数 = 前两个月之和。

    为什么? 因为第 n 个月的兔子 = 上个月的兔子(都还在)+ 这个月新生的兔子,而新生的兔子数是两个月前的兔子数(那些兔子到这个月满 3 个月开始生)。所以 f(n) = f(n-1) + f(n-2)。

    注意:

    • 第 50 个月的兔子数非常大(超过 10 亿),int 装不下,要用 long long
    • 用循环迭代而不是递归,避免递归重复计算太慢

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        long long a = 1, b = 1, t;
    
        if (n <= 2) {
            cout << 1;
        } else {
            // 从第 3 个月迭代到第 n 个月
            for (int i = 3; i <= n; i++) {
                t = a + b;  // 本月 = 上月 + 上上月
                a = b;
                b = t;
            }
            cout << b;
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N),循环到第 n 个月
    • 空间复杂度:O(1)
    • 1