微软面试题:买啤酒问题
2014-08-12 15:02
218 查看
1元钱买一瓶啤酒。
2个空瓶换一瓶啤酒。
问10元能买几瓶啤酒?
再问n元能买几瓶啤酒?
答:第一次:10瓶
第二次:10个空瓶换5个啤酒
第三次:5个空瓶换2个啤酒,剩一个空瓶
第四次:算上上次的空瓶,3个空瓶换1个啤酒,剩一个空瓶
第五次:算上第四次的一个空瓶,2个空瓶换1个啤酒,最后剩1个空瓶。结束。
合计:10+5+2+1+1=19
于是我推测公式:
第一次:10
第二次:10*1/2
第三次:10*1/(2^2)
第四次:10*1/(2^3)
第五次:10*1/(2^4),四舍五入为1(这步出错)
于是我归纳为10(1+1/2+1/2^2+...+1/2^n)
取极限为10(2-1/2^n)
公式中n=4,结果为19.375,取整为19。
问:当9元可买多少瓶?
9元可买9(2-1/2^n)
取n=4,结果为17.4375,取整17。
这个n的取法在于初始金额m<2^n,即可。我当时面试时取的时m>2^n时,n取最大值。
增加m<2^n这个条件后,公式m(2-1/2^n)=2m-m/2^n<2m-1.
所以,买啤酒问题实际的解是2m-1,即10元为19瓶,9元为17瓶。
考官的解为2m-1,用数学归纳法证明。这个证明未考虑详细。故不讨论。
View Code
2个空瓶换一瓶啤酒。
问10元能买几瓶啤酒?
再问n元能买几瓶啤酒?
答:第一次:10瓶
第二次:10个空瓶换5个啤酒
第三次:5个空瓶换2个啤酒,剩一个空瓶
第四次:算上上次的空瓶,3个空瓶换1个啤酒,剩一个空瓶
第五次:算上第四次的一个空瓶,2个空瓶换1个啤酒,最后剩1个空瓶。结束。
合计:10+5+2+1+1=19
于是我推测公式:
第一次:10
第二次:10*1/2
第三次:10*1/(2^2)
第四次:10*1/(2^3)
第五次:10*1/(2^4),四舍五入为1(这步出错)
于是我归纳为10(1+1/2+1/2^2+...+1/2^n)
取极限为10(2-1/2^n)
公式中n=4,结果为19.375,取整为19。
问:当9元可买多少瓶?
9元可买9(2-1/2^n)
取n=4,结果为17.4375,取整17。
这个n的取法在于初始金额m<2^n,即可。我当时面试时取的时m>2^n时,n取最大值。
增加m<2^n这个条件后,公式m(2-1/2^n)=2m-m/2^n<2m-1.
所以,买啤酒问题实际的解是2m-1,即10元为19瓶,9元为17瓶。
考官的解为2m-1,用数学归纳法证明。这个证明未考虑详细。故不讨论。
Console.WriteLine("买啤酒问题:一元买一瓶啤酒,两个空瓶换一瓶啤酒,问10元能买多少瓶啤酒?n元呢?请输入啤酒金额:"); decimal money; while (!Decimal.TryParse(Console.ReadLine(), out money)); int count = 0;//次数 List<int> beerTotal = new List<int>(); int full = (int)money;//啤酒 beerTotal.Add(full); int empty = 0;//空瓶 while (true) { //喝酒,出来空瓶了 empty += full; Console.WriteLine("第{0}次,买{1}瓶啤酒,有{2}瓶空瓶", count++, full, empty); //空瓶2换1啤酒 full = empty / 2; //使用列表记录对话瓶数,最后统计 beerTotal.Add(full); //剩余多少个啤酒 empty = empty % 2; //当换不了啤酒就结束吧。 if (full == 0) break; } Console.WriteLine("{0}元可以买{1}瓶啤酒,哦顺便告诉你还剩{2}个空瓶", money, beerTotal.Sum(), empty); Console.ReadKey();
View Code
相关文章推荐
- 一道微软面试题的解答【镜子问题】
- 终于搞清楚了C#二进制的一些关键操作了,解决了微软面试题,求数组中两两之差绝对值最小的值O(N)最少内存限制的问题!
- 从微软的一道面试题谈问题解决之道
- 微软面试题:飞机加油问题(智商被压制的节奏,好精妙)
- 输出1到N之间所有相加等于M的数字组合(背包问题)求相加为M的所有组合--微软酷派经典面试题
- 飞机加油问题,据说是微软的面试题。
- 关于一道微软面试题(据称)“飞机问题”详细解答
- 北美微软面试题---数组问题
- 微软面试题【飞机加油问题】题解
- 12个球问题--微软面试题
- 微软面试题-过桥问题
- 127名选手1:1淘汰赛决出优胜者问题 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- 链表环与两链表求交问题(2012年微软、新浪面试题)
- 面试题精选(87):两数组包含问题(来自微软面试题)
- 微软/IBM面试题之帽子问题、死狗问题
- 5个广口瓶被污染的药片,没污染的药每片10mg,被污染的每片9mg,一次称重找出被污染药瓶的问题 - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题
- 关于微软面试题:"四人过桥"问题的思考——“n人过桥”问题的演进(Java实现)
- 微软面试题--10个问题的逻辑推理题
- 微软面试题及答案(发散性问题)
- 微软面试题---求子数组最大乘积问题