2025-03-22 学习记录--C/C++-PTA 习题4-11 兔子繁衍问题
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
习题4-11 兔子繁衍问题
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
二、解题思路 ⭐️
月 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | … |
---|---|---|---|---|---|---|---|---|
对数 ❀ | 1 | 1 | 2 | 3 | 5 | 8 | 13 | … |
除 第
1
个月 外,当前月的对数 = 前两个月的对数之和。👉🏻 斐波那契数列
三、代码(C语言)⭐️
/**
* 斐波那契数列:
* 月: 1 2 3 4 5 6 7...
* 对数: 1 1 2 3 5 8 13...
* 除第1个月外,当前月的对数 = 前两个月的对数之和
*/
#include <stdio.h> // 引入标准输入输出库,用于使用 scanf 和 printf 函数
int main() {
int n; // 定义变量 n,用于存储目标兔子对数
scanf("%d", &n); // 读取目标兔子对数 n
// 单独处理第1个月的情况
if (n == 1) { // 如果目标兔子对数为 1
printf("1\n"); // 直接输出 1
return 0; // 程序结束
}
int prev2 = 0; // 定义变量 prev2,表示上上个月的兔子对数,初始为 0
int prev1 = 1; // 定义变量 prev1,表示上个月的兔子对数,初始为 1
int curr = 1; // 定义变量 curr,表示当前月的兔子对数,初始为 1
int month = 2; // 定义变量 month,表示当前月数,初始为 2
// 计算兔子对数,直到达到或超过目标对数 n
while (curr < n) { // 当 当前月的兔子对数 小于 目标对数 时,继续循环
prev2 = prev1; // 更新 上上个月的兔子对数 为 上个月的对数
prev1 = curr; // 更新 上个月的兔子对数 为 当前月的对数
curr = prev2 + prev1; // 计算当前月的兔子对数,等于前两个月对数之和
month++; // 月数加 1
}
// 输出达到目标兔子对数所需的最少月数
printf("%d", month);
return 0; // 程序正常结束
}