猴子吃桃问题

问题描述:

猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求猴子摘了多少个桃子


解题思路:

通过往前逆推的方法,可以解开此题。第n天桃子的数量是第n-1天吃剩下的,关键就是知道第n天如何推出第n-1天桃子的数量,然后一天一天继续往前推算即可。

举个例子,题目说,第10天想再吃时剩下一个,换句话也就是说,第9天吃完过后,剩下的桃子数量就是第10天的,现在第10天的数量是1,假设第9天还未吃时桃子的数量为x,由分析可知,第9天吃完过后桃子的数量就是1(第10天未吃时的数量),那么第10天的桃子的数量为:x-(x/2+1) = 1    等价于     x/2-1=1    ,可得第9天x的值是4,以此类推,便可以算出第8天、第7天、第6天、第5天.........

关键是要找出递推的公式:假设第i天的桃子数量为x2,第i-1天的桃子数量为x1,有:

x1-(x1/2+1)=x2 可以得出 x1 = (x2+1)*2,根据题意,当x2即第10天的数量为1时,第9天x1的数量为4,注意:这里的x1和x2都是未吃时的数量


代码实现:

知道当天未吃的桃子数量,要求前一天的桃子数量,这是个重复的过程,可以使用while循环,在循环体内,每次算出前一天的未吃的桃子数量之后,都要将其进行保存,才可以进行下一次的推算,那么循环的次数是多少呢?,我们可以假设一下,假设第2天要吃时发现桃子的数量剩下为1,那么前一天未吃时桃子的数量就是4,这个过程,思考一下,是不是只在循环体内执行一次即可。因此,如果知道第n天桃子的数量,要求桃子的总数量,循环的次数为n-1次

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int x1,x2;    //x1代表前一天桃子的数量,x2代表当天桃子的数量
    int k=9;      //k代表要执行的循环的次数,k=9是因为第10天要吃时剩1个,只要9次循环即可
    x2 = 1;       //x2 =1 是从第10天开始往前推算,第10天要吃时的数量是1
    while(k--)
    {
        x1 = (x2+1)*2;
        x2 = x1;
    }
    cout <<"猴子总共摘了"<<x1<<"个桃子"<<endl;
    return 0;
}

总结:

第一遍不懂看第两遍,第两遍不懂看第三遍,第三遍不懂看第四遍,第四遍不懂看第五遍,第n遍不懂看第n+1遍:

while(!看懂)

{

    看代码,别灰心!!!;

}

 

发布了39 篇原创文章 · 获赞 25 · 访问量 9649
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览