以下是解决上述计算给定月份兔子总对数问题的详细解题思路: ### 问题分析 本题描述的是一种特殊兔子的繁殖模式,其繁殖规律符合斐波那契数列的特征。我们需要根据给定的月份数 A,计算出该月份末兔子的总对数。 ### 繁殖规律分析 - 初始时只有1对新生小兔子。 - 第1个月末,原来的那对小兔子成长为成年兔子,此时兔子总对数仍为1对,且这对成年兔子从第2个月开始具备繁殖能力。 - 第2个月末,原来的那对成年兔子繁殖出1对新生小兔子,所以兔子总对数变为2对(1对成年兔子 + 1对新生兔子)。 - 从第3个月开始,情况变得有规律起来: - 上个月的成年兔子数量等于上上个月兔子的总对数(因为上上个月的兔子在经过一个月成长后都变为成年兔子了)。 - 上个月的新生兔子数量等于上个月成年兔子的数量(因为每对成年兔子每月繁殖1对新生兔子)。 - 那么本月兔子的总对数就等于上个月兔子的总对数加上上上个月兔子的总对数。 ### 代码实现思路 基于上述分析,我们来看代码中是如何实现计算兔子总对数的:
- 处理特殊情况(函数
solution部分): - 当A == 0时,还没有开始观察,所以兔子对数应该为0,直接返回0。 - 当A == 1时,根据题目描述,第1个月末只有1对兔子(原来的那对新生兔子成长为成年兔子),所以返回1。 - 当A == 2时,第2个月末有2对兔子(1对成年兔子和它繁殖的1对新生兔子),所以返回2。 - 通过循环计算一般情况(函数
solution部分): - 我们定义了三个变量:prevPrev用来存储上上个月兔子的总对数,初始化为1(对应第1个月的情况);prev用来存储上个月兔子的总对数,初始化为2(对应第2个月的情况);current用来存储当前要计算的月份兔子的总对数。 - 从第3个月(i = 3)开始,进入循环,每次循环计算一个月的兔子总对数,直到达到给定的月份A。 - 在循环中,根据前面分析的繁殖规律,当前月的兔子总对数current等于前两个月兔子总对数之和,即current = prevPrev + prev。 - 然后更新prevPrev和prev的值,为下一次循环做准备。prevPrev赋值为prev的值(因为下一次循环时,当前的prev就变成了上上个月的情况),prev赋值为current的值(因为下一次循环时,当前计算出的current就变成了上个月的情况)。 - 测试用例验证(函数
main部分): - 在main函数中,我们给出了几个典型的测试用例,分别是solution(1)、solution(5)和solution(15),并通过输出比较的结果(<< (solution(1) == 1) << std::endl;等)来验证solution函数在不同月份下计算兔子总对数的正确性。如果计算结果与预期相符,输出会是1,否则输出0。 通过这样的思路和代码实现,我们就可以根据给定的月份数准确计算出这种特殊繁殖模式下兔子群体的总对数。 代码如下
long long solution(int A) {
if (A == 0) {
return 0; }
else if (A == 1) {
return 1; }
else if (A == 2) {
return 2; }
long long prevPrev = 1;
long long prev = 2;
long long current;
for (int i = 3; i <= A; ++i) {
current = prevPrev + prev;
prevPrev = prev;
prev = current;
}
return current;
}
int main() {
std::cout << (solution(1) == 1) << std::endl;
std::cout << (solution(5) == 8) << std::endl;
std::cout << (solution(15) == 987) << std::endl;
return 0;
}