C语言程序设计(第三版)何钦铭著 习题4-11
题目
兔子繁衍问题。一对兔子,从出生后第 3个月起每个月都生一对兔子。
小兔子长到第3个月后每个月又生一对兔子。
假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到n对?
输入一个不超过10000的正整数n,输出兔子总数达到n最少需要的月数。试编写相应程序。
分析过程
输入
条件:输入一个不超过10000的正整数n
输出
条件:输出兔子总数达到n最少需要的月数
分析
第一个月 兔子总数为1
第二个月 兔子总数为1
第三个月 兔子总数为2=1+1(可生育的兔子有一对,所以生一对)
第四个月 兔子总数为3=2+1(可生育的兔子有一对,所以生一对)
第五个月 兔子总数为5=3+2(可生育的兔子有两对(第三个月生的一对,可以生了),所以生2对)
第六个月 兔子总数为8=5+3(可生育的兔子有三对(第四个月生的一对,可以生了),所以生3对)
第七个月 兔子总数为13=8+5(可生育的兔子有五对(第五个月生的两对,可以生了),所以生5对)
…
所以第n个月(当n大于三时),兔子总数为上个月的兔子总数,以及上上个月兔子总数之和。
特殊情况,如下。
n=1 总数为1;n=2 总数为1
即满足斐波那契数列(不懂可以百度一下)
代码
#include <stdio.h>
#include <math.h>
int main () {
/*定义变量*/
int n; /*定义变量,存储输入的正整数n*/
/*赋值*/
printf("请输入正整数n:\n"); /*输入提示*/
scanf("%d \n", &n); /*输入并赋给变量*/
/*计算*/
if(n == 1) printf("1"); /*输入1,则达到需要1个月*/
else {
int i;/*计算的为第几个月兔子总数*/
int num1 = 1; /*第i个月的上上个月兔子总数*/
int num2 = 1; /*第i个月的上个月兔子总数*/
int sum = 0; /*第i个月兔子总数*/
for(i = 2; sum <n ; i++ ){
sum = num1 + num2;/*第i个月兔子总数=上上个月兔子总数+上个月兔子总数*/
num1=num2; /*第i+1个月的上上个月兔子总数=第i个月的上个月兔子总数*/
num2=sum; /*第i+1个月的上个月兔子总数=第i个月的兔子总数*/
}
printf("达到数量%d,需要%d个月", n, i);/*执行循环的时候是先执行i++,然后在判断sum小于n是否成立,即sum大于n时,需要的月份为i*/
}
return 0;
}