1.问题描述:
猴子第1天摘下若干个桃子,当即吃了---半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第一天共摘了多少桃子。
2.分析:
我们先站在数学的角度来分析的问题,设第一天共摘了X个桃子,第一天吃完桃子后还剩下
(X/2-1)个桃子;第二天吃完桃子后还剩下((X/2-1)/2-1)个桃子;以此类推,第九天吃完后还剩下(X-2-4-....2^9)/2^9个桃子,由于第十天没吃,所以((X-2-4-....2^9)/2^9)=1;
3.编程实现
数学上的分析已经完成了,那该怎么编程实现呢?
咱们直接来看代码的主体部分:
int x=1,i=0;
while(1)
{
for(i=1;i<10;i++)
{
x=x/2-1;
}
if(x==1)
{
printf("第一天共摘了%d个桃子\n",x);
break;
}
else
{
x++;
}
}
首先定义变量x和i并初始化,由于x的值未知,是我们要求的值,我们可以通过循环的方式实现;
for循环中i<10而不是i<=10,是因为猴子只吃了9天,第10天想再吃时,就剩一个了,就没吃,所以
应该是i<10;之后的代码我们通过前面的数学分析很容易理解。
那么这看似没问题的代码真的可以解决问题吗?下面是运行结果:
可以看到什么也没有输出,这是代码死循环了。那是什么原因导致的呢?
很显然是x出问题了。x出for循环后来到if,可以看到第一次出for循环后,x=-1
这时自然来到了else,x++后x=0;
再次循环,出for循环后x又再次等于-1,这就进入了死循环;
既然上面的代码不可行,那该如何改进呢?
很简单,定义一个临时变量tmp,使得刚进入while循环时,tmp=x,再将for循环中的x改为tmp,if语句中的x改为tmp,这样x的值就不会受到for循环的影响。修改好的代码如下图所示:
int x = 1, i = 0,tmp=1;
while (1)
{
tmp = x;
for (i = 1; i < 10; i++)
{
tmp= tmp/ 2 - 1;
}
if (tmp == 1)
{
printf("第一天共摘了%d个桃子\n", x);
break;
}
else
x++;
}
我们再来看看运行结果:
答案是1534。