18.12.09-C语言练习:兔子繁衍问题 / Fibonacci 数列
题目:
问题解析:
这是典型的/Fibonacci 数列问题。具体这里不赘述。
问题中不论是初始的第1对兔子还是以后出生的小兔子都是从第3个月龄起每个月各生一对兔子。
设n1,n2,n3分别是每个月1个月月龄,2个月月龄,大于等于3个月月龄的兔子数量。则下个月这三个类型月龄兔子数量分别是 n3, n1, n3+n2。
即:下个月1个月月龄兔子数量是上个月大于等于3个月月龄兔子的数量,2个月月龄兔子数量是上个月1个月月龄兔子数量,大于等于3个月月龄兔子数量是上个月大于等于3个月月龄兔子数量加上上个月2个月月龄兔子数量。
程序:
1 #include <stdio.h> 2 int main(void) { 3 /*n1, n2, n3 分别是有1个月月龄,2个月月龄,3个月月龄的兔子数量*/ 4 int n1 = 1, n2 = 0, n3 = 0; 5 /*total 是兔子总数量*/ 6 int total = 0; 7 /* i 是月份, num是输入变量, t是中间变量 */ 8 int i=1, num, t; 9 printf("请输入数量:"); 10 scanf("%d", &num); 11 while(1){ 12 total = n1 + n2 + n3; 13 if(total >= num) break; 14 /*求下个月兔子数量*/ 15 i += 1; 16 /*下面四行语句注意顺序不能混乱*/ 17 t = n1; 18 n1 = n3 + n2; 19 n3 += n2; 20 n2 = t; 21 } 22 printf("所需月数:%d\n", i); 23 return 0; 24 }
程序执行结果:
问题表述中可能不严谨的地方:
1. 第一对兔“第3个月起”, 新生兔子“第3个月后”。不够严谨,因为月是一个时间段,应统一理解为“三个月后”。上述程序也是这么理解的。
2. “第几个月时兔子总数才可以达到n对?”。似乎有歧义:刚好达到n对还是大于等于n对。上述统一理解为“大于等于n对”。