您的位置:首页 > 编程语言 > C语言/C++

【C语言-14】一维 数组大课堂第二讲~~~(古典数学问题"兔子繁衍"三种算法)

2019-03-23 12:19 495 查看

 

目录

 

 

兔子问题:

解题思路:

循环计算初级版:

循环计算升级版:

数组处理法:

 

兔子问题:

      有一个有趣的古典数学问题:有一对兔子,出生后三个月每个月都生一对兔子,小兔子长到了第三个月后每个月又生一对兔子,假设所有的兔子都不死,问每个月的兔子总数为多少?

      题目分析:

兔子繁殖的规律分析
月数 小兔子对数 中兔子对数 老兔子对数 兔子总对数
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,从第三个数开始,该数是其前面两个数的和;

解题思路:

  1. 设第一个月兔子数为m1,第二个月兔子数为m2,第三个月兔子数为m3,m3=m1+m2;
  2. 第四个月兔子对数,将m2(第二个月的兔子对数)赋值给m1,吧m3赋值给m2,执行m3=m1+m2,m3就是第四个月兔子对数;
  3. 以后以此类推,计算60个月(五年)后当月兔子数量;

循环计算初级版:

[code]#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;
}

运行结果:

程序总结:

  1. 程序虽然正确,,运行结果正确,但是一行一个月篇幅过大;

循环计算升级版:

[code]#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;
}

运行结果:

 

数组处理法:

前两种算法可以保证顺序计算并输出各数,但不能在内存中保存,如果想制定输出某个月的兔子对数比较困难,利用数组相对简单;

每个数组元素代表数列中一个数,依次求出并且相应存放即可;

代码如下:

[code]#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;
}

运行结果:

念长安雪厚,故人已故;

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐