猴子吃桃问题

有一些桃子,一只猴子,每天吃一半+1个桃子,6天吃完。问:一共有多少个桃子?

http://bbs.csdn.net/topics/390510854


这个问题想了很久也没想出来,后来经过点拨,终于有了一点头绪。

发现写这个程序,其实和做数学题应用题一样, 第一步都是通过既有的数据得到隐含的数据信息。

第二步是通过得到的数据,找寻规律。


拿这个问题举例,首先可以得到的信息

①桃子的总数肯定是偶数


假设上一天剩余n个桃子,那么今天要吃n/2+1个桃子,那么今天剩余的桃子数为n/2-1个(n-(n/2+1))

②每天吃的桃子数比剩下的桃子数多2个【(n/2+1) - (n/2-1)】


假设第5天剩下的桃子数为x,那么第6天吃完说明 x/2 + 1 = x;(x = 2)

③第6天吃了2个桃子,也就是第5天剩了2个桃子


从上一条我们得到了一个非常具体的值,问题是怎么利用这个值去求第5天的相关数据,继而逐渐推出总数。

第5天剩了2个桃子,那么由第2条得知第5天吃了2+2=4个桃子,所以第4天剩余的桃子数为4+2 =6,递推可以得到如下关系

④天数     吃几个    剩几个     

第6天:          2             0

第5天:          4             2

第4天:          8             6

第3天:         16         14

第2天:         32          30

第1天:         64          62


从上面的数据,我们可以得到一个规律是每天吃几个的数据是2的阶层(2、4、8、16、32、64)

2^6 = 64;在根据第2天规律那么总数就是64+ (64-2) = 126

相信如果问题是7天吃光,你就很快知道答案是2^7 + (2^7 - 2)

类推如果问题是n天吃光,你就很快知道答案是2^n + (2^n - 2) =>2^(n+1) -2【2^(n+1) 等价于2左移n位】

于是有了smsgreenlife给出的答案:

#include <stdio.h>

int main(void)
{
	int n = 6;
	printf("%d\n", ((unsigned int)2<<n)-2);
	return;
}

上面的规律是从每天吃几个得到的规律,其实从每天剩几个的数据同样可以得到规律,也就是for循环的逻辑.

今天吃几个+今天剩几个 = 昨天剩几个

第5天剩几个:(0   + 2)  +   0 = 2

第4天剩几个:(2   + 2)  +   2 = 6

第3天剩几个:(6   + 2)  +   6 = 14

第2天剩几个:(14 + 2)  + 14 = 30

第1天剩几个:(30 + 2)  + 30 = 62

规律是第n天剩余的个数是第计算n-1天剩余个数公式中的第一个数(即2、6、14、30)

#include<stdio.h>

int main(void)
{
	int n = 2;
	int i ;
	for(i = 1 ; i < 6 ; i++)
	{
		n = 2*n+2;
	}
	printf("%d\n",n);

}


生活是一部挺狗血的片子啊,才过了2天,笔试的时候竟然让我碰到了类似的题o(≧v≦)o~~

这次的问题是:

有一些桃子,一只猴子,每天吃一半+1个桃子,10天吃完后还剩一个。问:一共有多少个桃子?


①桃子的总数肯定是偶数

②每天吃的桃子数比剩下的桃子数多2个,那么第10天是吃了1+2 = 3个

③天数     吃几个    剩几个     

第10天:        3            1

第9天:          6             4

第8天:         12            10

........

#include<stdio.h>

int main(void)
{
	int n = 1;
	int i ;
	for(i = 1 ; i < 10 ; i++)
	{
		n = 2 * n + 2;
	}
	printf("%d\n",n);

}

上面for循环的例子中,n都是代表剩余的个数,对于6天吃完的情况i是从1开始的,因为第6天没剩,所以少循环一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值