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

 

目录

 

 

兔子问题:

解题思路:

循环计算初级版:

循环计算升级版:

数组处理法:


 

兔子问题:

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

      题目分析:

兔子繁殖的规律分析
月数 小兔子对数 中兔子对数 老兔子对数 兔子总对数
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数列;

扫描二维码关注公众号,回复: 5830102 查看本文章

这个数列有如下特点:第1,2两个数分别为1,1,从第三个数开始,该数是其前面两个数的和;

解题思路:

  1. 设第一个月兔子数为m1,第二个月兔子数为m2,第三个月兔子数为m3,m3=m1+m2;
  2. 第四个月兔子对数,将m2(第二个月的兔子对数)赋值给m1,吧m3赋值给m2,执行m3=m1+m2,m3就是第四个月兔子对数;
  3. 以后以此类推,计算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;
}

运行结果:

程序总结:

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

循环计算升级版:

#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;
}

运行结果:

念长安雪厚,故人已故;

猜你喜欢

转载自blog.csdn.net/weixin_44749767/article/details/88757465