【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,从第三个数开始,该数是其前面两个数的和;
解题思路:
- 设第一个月兔子数为m1,第二个月兔子数为m2,第三个月兔子数为m3,m3=m1+m2;
- 第四个月兔子对数,将m2(第二个月的兔子对数)赋值给m1,吧m3赋值给m2,执行m3=m1+m2,m3就是第四个月兔子对数;
- 以后以此类推,计算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; }
运行结果:
程序总结:
- 程序虽然正确,,运行结果正确,但是一行一个月篇幅过大;
循环计算升级版:
[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; }
运行结果:
念长安雪厚,故人已故;
相关文章推荐
- 习题4-11 兔子繁衍问题 (15 分)(递归算法)(数组算法)
- 【白话算法】动态规划算法什么时候能用一维数组解问题
- C语言实例8——古典问题:兔子问题
- C语言_古典问题:斐波那契数列(兔子增长)
- 第三节 数学算法解决C语言问题
- 左神算法课堂系列--数组划分最大绝对值之差问题
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 斐波那契数列问题-兔子繁衍问题-c语言-c++-经典问题-编程
- 10月 5日 c语言 一维数组 处理Fibonacci 数列问题
- 算法导论之最大子数组问题 C语言实现
- C语言实现:古典问题——兔子生崽
- 用递归法:设计算法求解汉诺塔问题,并编程实现。 (1) Hanoi(汉诺)塔问题分析 这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座 A,B,C
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- C语言求最小公倍数和最大公约数三种算法
- 不用数组函数,也不用冒泡排序,得到一维数字数组第二大的值
- 编程之美 2.10 扩展问题:求数组中的第二大数
- 斐波那契数列。古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?
- 一维数组常见的三种排序、冒泡排序、选择排序、插入排序、Arrays内置排序
- 常见算法:C语言求最小公倍数和最大公约数三种算法
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格