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

 

目录

 

 

兔子问题:

解题思路:

循环计算初级版:

循环计算升级版:

数组处理法:


 

兔子问题:

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

      题目分析:

兔子繁殖的规律分析
月数小兔子对数中兔子对数老兔子对数兔子总对数
11001
20101
31012
41113
52125
63238
753513
885821
..............................

每个月兔子总对数一次为: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个月(五年)后当月兔子数量;

循环计算初级版:

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

运行结果:

念长安雪厚,故人已故;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值