猴子吃桃问题

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。

 

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值