前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >猴子吃桃问题

猴子吃桃问题

作者头像
aosei
发布2024-01-23 13:09:22
1440
发布2024-01-23 13:09:22
举报
文章被收录于专栏:csdn-nagiY

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.编程实现

数学上的分析已经完成了,那该怎么编程实现呢?

咱们直接来看代码的主体部分:

代码语言:javascript
复制
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循环的影响。修改好的代码如下图所示:

代码语言:javascript
复制
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。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档