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,用数学归纳法证明。这个证明未考虑详细。故不讨论。

 1  Console.WriteLine("买啤酒问题:一元买一瓶啤酒,两个空瓶换一瓶啤酒,问10元能买多少瓶啤酒?n元呢?请输入啤酒金额:");
 2
 3           decimal money;
 4
 5           while (!Decimal.TryParse(Console.ReadLine(), out money));
 6
 7           int count = 0;//次数
 8
 9           List<int> beerTotal = new List<int>();
10
11           int full = (int)money;//啤酒
12
13           beerTotal.Add(full);
14
15           int empty = 0;//空瓶
16
17           while (true)
18
19           {
20
21               //喝酒,出来空瓶了
22
23               empty += full;
24
25                 Console.WriteLine("第{0}次,买{1}瓶啤酒,有{2}瓶空瓶", count++, full, empty);
26
27               //空瓶2换1啤酒
28
29               full = empty / 2;
30
31               //使用列表记录对话瓶数,最后统计
32
33               beerTotal.Add(full);
34
35               //剩余多少个啤酒
36
37               empty = empty % 2;
38
39               //当换不了啤酒就结束吧。
40
41               if (full == 0)
42
43                   break;
44
45           }
46
47             Console.WriteLine("{0}元可以买{1}瓶啤酒,哦顺便告诉你还剩{2}个空瓶", money, beerTotal.Sum(), empty);
48
49           Console.ReadKey();

View Code

转载于:https://www.cnblogs.com/czg10047/p/3907343.html

微软面试题:买啤酒问题相关推荐

  1. 历届试题 买不到的数目

    历届试题 买不到的数目   时间限制:1.0s   内存限制:256.0MB 问题描述 小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖. 小朋友来买糖的时候,他就 ...

  2. 答与微博前端教主在吃饭时讨论到的一道微软面试题

    加引号是因为我不知道是否真是微软面试题.题目是这样的: 有一车在某无限长公路上行驶,其起始位置和单位时间内速度均为有限大整数(正负不确定), 现有一仪器,在每一时间单位内可以探测1次车是否在指定位置, ...

  3. 试题 历届试题 买不到的数目(dp/数学)

    试题 历届试题 买不到的数目 资源限制 时间限制:1.0s 内存限制:256.0MB $Daily English 曾几何时,我流连梦境,心比天高,人生充满希望. I dreamed a dream ...

  4. 微软面试题:正则表达式提取链接地址

    写出正则表达式,从一个字符串中提取链接地址.比如下面字符串中 "IT面试题博客中包含很多  <a href=http://hi.baidu.com/mianshiti/blog/cat ...

  5. 微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字

    /******************************************************************************* 文 件 名 : test100.cpp ...

  6. 微软面试题之数字谜题方案

    微软面试题之数字谜题方案 设有两个自然数m,n,2〈=m<=99. S先生知道这两数的和s,P先生知道这两数的积p.他们两人进行了如下的对话: S:我知道你不知道这两个数是什么,但我也不知道. ...

  7. 微软面试题之数字谜题 (转)

    微软面试题之数字谜题 (转)[@more@] 设有两个自然数m,n,2〈=m<=99. S先生知道这两数的和s,P先生知道这两数的积p.他们两人进行了如下的对话: S:我知道你不知道这两个数是什 ...

  8. 烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一 个小时十五分钟呢?(微软面试题)

    烧一根不均匀的绳,从头烧到尾总共需要1个小时.现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?(微软面试题) 解法: 三根绳子三个步骤: 先拿出两个绳子第一个绳子从一头点火,第 ...

  9. 微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?

    微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点.地球上有多少个满足这样条件的点? 分析:这是一道智力题.从逻辑上来讲,题目从好像缺少了一次向西的过程,才可 ...

最新文章

  1. postgresql开发中可能有用的知识
  2. Centos nginx 安装 源码方式安装
  3. 阿里疯传,手把手教你如何从0开始开展UI自动化测试?
  4. 百度地图api location 211 sn校验失败
  5. [java进阶]4.关键字throws和throw
  6. leetcode 35. 搜索插入位置 思考分析
  7. linux conda创建虚拟环境
  8. Python 爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...
  9. Flutter基础(四)开发Flutter应用前需要掌握的Basic Widget
  10. vue json对象转数组_vue的数据驱动原理及简单实现
  11. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  12. 太原今年实施一批大数据重大项目
  13. 红孩儿编辑器模块设计7
  14. linux mysql 开发环境_RedHat Linux下QT平台MySQL数据库开发环境配置
  15. 计算机笔记--【并发编程①】
  16. matlab 积分函数曲线,Matlab之函数积分 | 学步园
  17. VC2008下使用OpenSSL 1.0.0g(免编译)
  18. 「双软认定」软件企业需要满足什么条件?
  19. 视频教程-清华-尹成老师-Python爬虫day13-Python
  20. C语言字符集中可显示字符,C++_C语言转义字符实例详解,在字符集中,有一类字符具有 - phpStudy...

热门文章

  1. 【合集】Word中常见疑问
  2. 2008服务器怎么组件共享组,Windows Server 2008服务器文件共享服务器搭建
  3. Laravel基础二之Migrations和验证
  4. 方德系统突然启动不了,出现提示initramfs>
  5. 知名ECM厂商Open Text进军中国市场
  6. maven+springMVC+mysql+mybatis+velocity+事务整合
  7. STL标准库常见面试题(一)
  8. 第五章——决策树笔记(《统计学习方法》-李航)
  9. 雅思7分的思考于回忆
  10. 还在为推广发愁?这里有一份活动推广渠道清单请查收