猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第1... 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下一个桃子了.求第一天共摘了多少?要求用户输入不同的天数n,同时输出回推过程中每一天的桃子数,还要增加对用户输入数据的合法性认证,如输入的天气为0,负数和非数字时要求用户重新输入 展开
 我来答
嘛咪嘛咪轰la
2017-04-19 · TA获得超过7675个赞
知道大有可为答主
回答量:6023
采纳率:0%
帮助的人:1252万
展开全部
先分析问题:用逆向思维来思考它,根据题意“以后每天早上吃前天剩下的一半零一个”,则我们可以用逆向思维来推导它,即从第十天往前推。已知第十天有一个,根据题意第九天应该就是(1+1)*2=4个,第八天应该就是(4+1)*2=10,第七天应该就是(10+1)*2=22,第六天应该就是(22+1)*2=46,依此类推,直至第1天应该就是第2天(766+1)*=1534个桃子,即猴子第一天摘了1534个桃子。为了验证这个推导的正确性,你可以按正常逻辑来把它(即此时由前往后)推导,即由第一天1534个桃子,第二天就是1534/2-1=766个桃子,依此类推,直至第十天,那么猴子此时就会发现只剩一个。至此,我们由了推导的思想,再来编写的代码,就是小菜一碟的事情啦,实现的它方式无非就是那么两种,一种是简单的for循环,另一种是递归。这里我采用递归,因为解决此类问题往往用递归来思考它,会让问题变得更简单。按照数学思维来说就是求未知数,则可以根据已知数出发进行求解(那么这里的已知数已经告诉了我们,它说第十天只有一个桃子)。下面是我的递归算法来求解它的方法:#includeusingnamespacestd;intrecurrent_monkey(intdays)//猴子吃桃递归{intpeach;if(days==10)peach=1;//递归出口条件(已知条件第10天只有一个桃子)elsepeach=(recurrent_monkey(days+1)+1)*2;returnpeach;}intmain(){intdays=1;cout<
jasson918
2017-04-20 · TA获得超过2865个赞
知道小有建树答主
回答量:1100
采纳率:66%
帮助的人:423万
展开全部
程序中错误比较多:
1、是一个思维问题,猴子吃桃子会不会把一个桃子分两半来吃,你在程序中使用了实数,而不是整数,应该判断是不是能够被2整除;
2、i使用实数,也就是浮点数,而输出的时候使用的是%d的格式,所以,输出为0,可以改变格式为%f,或者将i转变成整数(printf("%d\n",(int)i);)
3、在外循环内部,改变了循环控制变量的值,也就是i的值,第一个循环下来,i的值就成了0了,所以不可能再循环,即使再循环,结果也不是要判断的i值,而是经过多次运算后的结果:1,你可以引入另外一个变量来做内循环和进行判断。

void main()
{
int j,k;
int i;
for(i=10000;i>1;i--)
{
k=i;
for(j=1;j<=10;j++)
{
if(k!=(k/2)*2) break;
k=k/2-1;
// printf("%d\n",k);
}
if(k==1) break;
}
printf("%d\n",i);
/* int i,j;
j=1;
for(i=0;i<10;i++)
j=(j+1)*2;
printf("%d\n",j);*/
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式