您的位置:首页 > 其它

猴子吃桃问题

2013-07-07 23:19 106 查看
有一些桃子,一只猴子,每天吃一半+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天没剩,所以少循环一次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: