目录
兔子问题:
有一个有趣的古典数学问题:有一对兔子,出生后三个月每个月都生一对兔子,小兔子长到了第三个月后每个月又生一对兔子,假设所有的兔子都不死,问每个月的兔子总数为多少?
题目分析:
月数 | 小兔子对数 | 中兔子对数 | 老兔子对数 | 兔子总对数 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 1 | 2 | 5 |
6 | 3 | 2 | 3 | 8 |
7 | 5 | 3 | 5 | 13 |
8 | 8 | 5 | 8 | 21 |
...... | ...... | ...... | ...... | ...... |
每个月兔子总对数一次为:1,1,2,3,5,8,13,21........,这组数字也叫Fibonacci数列;
这个数列有如下特点:第1,2两个数分别为1,1,从第三个数开始,该数是其前面两个数的和;
解题思路:
- 设第一个月兔子数为m1,第二个月兔子数为m2,第三个月兔子数为m3,m3=m1+m2;
- 第四个月兔子对数,将m2(第二个月的兔子对数)赋值给m1,吧m3赋值给m2,执行m3=m1+m2,m3就是第四个月兔子对数;
- 以后以此类推,计算60个月(五年)后当月兔子数量;
循环计算初级版:
#include<stdio.h>
int main(){
int m1 = 1, m2 = 1, m3;
int i;
printf("%8d\n%8d\n", m1, m2);
for (i = 1; i <= 38; i++) {
m3 = m1 + m2;
printf("%8d\n", m3);
m1 = m2;
m2 = m3;
}
return 0;
}
运行结果:
程序总结:
- 程序虽然正确,,运行结果正确,但是一行一个月篇幅过大;
循环计算升级版:
#include<stdio.h>
int main(){
int m1 = 1, m2 = 1;
int i;
for (i = 1; i <= 20; i++) { //每个循环中输出2个月的数据,故循环20次即可
printf("%8d%8d", m1, m2);
if (i % 2 == 0)
printf("\n");
m1 = m1+m2;//计算下一个月的兔子对数,并且存在m1中;
m2 = m2+m1;//计算下两个月的兔子对数,存放在m2中;
}
return 0;
}
运行结果:
数组处理法:
前两种算法可以保证顺序计算并输出各数,但不能在内存中保存,如果想制定输出某个月的兔子对数比较困难,利用数组相对简单;
每个数组元素代表数列中一个数,依次求出并且相应存放即可;
代码如下:
#include<stdio.h>
int main(){
int i;
int a[20] = { 1,1 }; //对最前面两个数a[0]和a[1]赋初值1;
for (i = 2; i < 20; i++) {
a[i] = a[i - 2] + a[i - 1];//求出a[2]~a[19]的值;
}
for (i = 0; i < 20; i++) {
if (i % 5 == 0) //控制每次输出五个数后换行;
printf("\n");
printf("%8d", a[i]);
}
printf("\n");
return 0;
}
运行结果:
念长安雪厚,故人已故;