最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

今日观点!兔子产子问题

来源:博客园


(资料图片仅供参考)

一、问题描述:

二、设计思路:

遇到这种兔子不死的爆发户问题,先不要慌,列个表先

通过这个表可以清楚知道兔子总数随月份变化的规律依次为1,1,2,3,5,8,13......很明显是斐波那契(Fibonacci)数列,对了忘了介绍,小兔子代表出生了1个月的兔子,中兔子代表出生2个月的兔子,老兔子代表出生3个月以上的兔子,此题的切入点转化为从斐波那契入手,用迭代的思想反映出来。

跌代的思想主要在于初值和迭代公式,现在思路已经很清晰了。

三、程序流程图:

四、代码实现:

#includeint main(){    long fb1=1;//表示前一个月的兔子数量    long fb2=1;//表示前两个月的兔子数量    long fb;//表示当前月份的兔子数量    printf("%12ld%12ld",fb1,fb2);//输出第一月和第二月的兔子数量    for(int i=3;i<=30;i++)    {        fb=fb1+fb2;//当前月份的兔子数量=前面一个月+前面两个月        printf("%12ld",fb);        if(i%4==0)//这里起到一个格式作用        {        printf("\n");//每行输出四个        }        fb2=fb1;//把前一个月的兔子数量赋给前两个月,实现月份的后移        fb1=fb;//把当月的兔子数量赋给前一个月,实现月份的后移            }    return 0;}

我们还可以稍微改进一下,只用两个变量来表示

#includeint main(){    long fb1=1;//表示前一个月的兔子数量    long fb2=1;//表示前两个月的兔子数量    for(int i=1;i<=15;i++)//循改进减少一半    {        printf("%12ld%12ld",fb1,fb2);        if(i%2==0)//这里起到一个格式作用        {            printf("\n");//每行输出2个        }        fb1=fb1+fb2;//直接表示最新一个月的兔子数量        fb2=fb1+fb2;//直接表示比fb1还新一个月的兔子数量            }    return 0;}

时间缩短了一点有木有?我们平时就应该精炼算法,以后拿到工程可以尽可能的提高效率,跌代的思想比较难掌握,关键在于初值和迭代公式,怎样才能套娃套起来,然后思考什么时候我停止套娃,也就是迭代的终止条件,稍有不慎就会出现死循环,继续坚持学习,人类的赞歌就是勇气的赞歌。

关键词: