猴子吃桃问题
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给出的答案:
上面的规律是从每天吃几个得到的规律,其实从每天剩几个的数据同样可以得到规律,也就是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)
生活是一部挺狗血的片子啊,才过了2天,笔试的时候竟然让我碰到了类似的题o(≧v≦)o~~
这次的问题是:
有一些桃子,一只猴子,每天吃一半+1个桃子,10天吃完后还剩一个。问:一共有多少个桃子?
①桃子的总数肯定是偶数
②每天吃的桃子数比剩下的桃子数多2个,那么第10天是吃了1+2 = 3个
③天数 吃几个 剩几个
第10天: 3 1
第9天: 6 4
第8天: 12 10
........
上面for循环的例子中,n都是代表剩余的个数,对于6天吃完的情况i是从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天没剩,所以少循环一次
相关文章推荐
- 猴子吃桃问题
- 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只
- 08年以前华中科大机试第8道题目(约瑟夫环问题(传说中的猴子选大王))
- 『每日一题 2012-02-10』猴子选大王问题 C语言实现
- 猴子吃桃--------两个猴子吃桃问题解决的详细描述
- 猴子分桃问题
- 猴子吃桃问题
- 【面试】Liveramp 面试题 面经 猴子过河问题
- 解决猴子选大王问题(用C,原创)
- 5只猴子分桃子问题
- 两个关于数列的Python脚本(斐波那契数列和猴子吃香蕉类问题)
- 猴子问题
- 【Java学习之代码学习】 Prog03_猴子分桃问题
- 猴子选王问题答案
- 猴子吃桃问题(15 point(s))
- 猴子吃桃问题。
- 猴子吃桃问题——递归算法解答
- 6.10猴子吃桃问题。
- 经典c程序(0017)---猴子吃桃问题
- 猴子吃桃问题