运维开发网

详细介绍C语言解决的经典问题

运维开发网 https://www.qedev.com 2022-06-09 21:13 出处:网络
有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?本文将用C语言解决这一经典问题,需要的可以参考一下

有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总数为多少?本文将用C语言解决这一经典问题,需要的可以参考一下


1. 问题描述

有一对兔子,从出生后第三个月开始,每个月都生。

兔子长到第三个月以后,每个月又有一对兔子出生。假设所有的兔子都是不死之身,那么30个月内每个月的兔子总数是多少?



2. 题目分析

这是一个有趣的经典数学问题。我们来画一张表,找出兔子数的规律。


提示:一个月以下的兔子为小兔子,一个月以上两个月以下的为中兔子,三个月以上的为老兔子。

可以看出,每个月的兔子总数是1,1,2,3,5,8,13hellip这是斐波那契数列。

总结出序列的规律:即从前两个月的兔子数可以推导出第三个月的兔子数。


3. 算法设计

本题是一个典型的迭代循环,即不断用新值替换变量的旧值,再由变量的旧值推导出变量的新值的过程。

这种迭代与以下因素有关:初始值、迭代公式和迭代次数。经过问题分析,该算法可以描述为:


用c语言描述代选公式,即fib = fib1+fib 2。

其中fib是新计算的兔子数量。

Fib1是上个月兔子的数量。

Fib2存储前两个月的兔子数量,然后为下一代选择做准备。


做如下赋值:fib2=fib1,fib1=fib,注意赋值的顺序。所选择的世代数由循环变量控制,指示所寻找的月数。


4. 代码实现

完全码

#include lt;stdio.hgt;int main(){ long fib1 = 1; long fib2 = 1; long fib = 0; int i = 0; printf("%12d%12d", fib1, fib2); for (i = 3; i lt;= 30; i++) { fib = fib1 + fib2; printf("%12d", fib); if (i % 4 == 0) { printf("\n"); } fib2 = fib1; fib1 = fib; } printf("\n"); return 0;}

运行结果


代码解释



5. 算法升级

这个程序虽然正确,但还可以改进。

目前使用三个变量来计算下个月的兔子数量。事实上,未来两个月的兔子数量可以在循环中一次性计算出来,只需要两个变量就可以实现。

这里fib1+fib2的结果不是放在fib1,而是放在fib1。此时,FIB1不再代表前一个月的兔子数量,而是代表最近一个月的兔子数量。

然后执行fib2=fib1+fib2。此时fib1的兔子数是第三个月,所以fib2的兔子数是第四个月。

可以看出,此时fib1和fib2是最近两个月的兔子数量,通过循环可以推导出未来两个月的兔子数量。

改进过程如下

#include lt;stdio.hgt;int main(){long fib1 = 1, fib2 = 1;int i = 0;for (i = 1; i lt;= 15; i++){printf("%12d%12d", fib1, fib2);if (i % 2 == 0){printf("\n");}fib1 = fib1 + fib2;fib2 = fib1 + fib2;}return 0;}

代码解释


这篇关于C语言解决兔子产卵这个经典问题的详细讲解到此为止。关于C语言兔子产卵的更多信息,请搜索SourceNet之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持SourceNet!


0

精彩评论

暂无评论...
验证码 换一张
取 消