一、题目描述
第一个月有一对刚出生的兔子,它们长到第三个月就有了生育能力,以后每个月都生一对兔子。所以出生的兔子,都会在出生后的第三个月具有生育能力,且所有的兔子都不会死。
要求用户输入一个数字N,程序计算出到第几个月兔子的对数能达到N。
二、代码实现
这个问题里,ret=month++的用法值得关注。它的特点是,month虽然已经增长了1,ret得到的赋值还是month增长前的值。
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int fn=1; //本月兔子总对数
int fn_1=1; //上个月兔子总对数
int fn_2=1; //上上个月兔子总对数
int N; //我们要达到的兔子对数
int month=1; //本月是第几月
int ret=1; //这也是月份,它是我们最终的结果
scanf("%d",&N); //从用户处获取要达到的兔子总对数
while(fn<N) //当本月兔子总对数小于我们要达到的数量时,进行循环
{
if(month>=3){ //前两个月,最初的那对兔子还没有成年,所以兔子数量无变化
fn=fn_1+fn_2; //从第三个月开始,本月兔子数量等于上个月和上上个月的数量之和
fn_2=fn_1; //把上上个月的兔子数量换成上个月的
fn_1=fn; //把上个月的兔子数量换成本月的
}
//月份递增,把月份增长前的数值赋给ret
//因为我们是先计算本月的兔子数量,再变成新的一个月,然后再判断当前数量是否已达到N
//所以月份总是超前了
ret=month++;
}
printf("%d",ret); //打印最终的结果
return 0;
}