问题描述:现在有N元钱,两块钱一瓶,或者直接给你N瓶酒,两个空瓶换一瓶酒,四个瓶盖换一瓶酒,问你最后可以喝多少瓶?如果能借酒呢?

解决思路1:

N元钱,其实就是N/2瓶酒。所以我们在程序中直接使用N瓶酒进行计算,直接使用递归,直到最后余下的酒瓶和瓶盖不够换酒。但是要注意:每次换酒后可能会剩下酒瓶和瓶盖,比如3个酒瓶和5个瓶盖,拿出2个酒瓶和4个瓶盖换完2瓶酒,剩下1个酒瓶和1个瓶盖,需要“存”起来,可以和下一轮新增的酒瓶和瓶盖一起换酒。代码如下

import java.util.Scanner;public class Cnt_N_Beer {
//    存储每一次换完酒剩余的酒瓶和瓶盖static int bottle = 0;static int cap = 0;static int beer(int n){
//        使用当前的酒+酒瓶+瓶盖计算可以换的酒int re_n = (bottle+n)/2 + (cap+n)/4;bottle = (bottle+n)%2;cap = (cap+n)%4;
//        结束条件是换不了酒,那么直接返回,结束递归if(re_n == 0){return n;}return n+beer(re_n);}public static void main(String[] args) {Scanner user = new Scanner(System.in);System.out.print("please input an integer:");int n = user.nextInt();int beer_cnt;
//        如果啤酒数量不够两瓶,没得换,直接返回啤酒数量if((n<=1) && (n>=0)) {beer_cnt = n;bottle = n;cap = n;System.out.println("beer is " + beer_cnt);
//        如果输入的啤酒数量为负数,提示}else if (n<0){System.out.println("beer count can't be negative");}else {
//        使用beer方法递归计算beer_cnt = beer(n);System.out.println("beer is " + beer_cnt);}
//        输出最后剩余的酒瓶数和瓶盖数System.out.println("bottle is " + bottle);System.out.println("cap is " + cap);}
}

几个测试结果如下

      

不知道你有没有发现,不管酒的数量是多少,最后剩下的酒瓶都是1个,瓶盖数是3个 ,等会第二种解决方案会用到这个性质。那么我们是不是可以验证一下,是不是真的每一次都会剩余1个酒瓶,3个瓶盖?使用do_while循环验证如下。

public class Cnt_N_Beer {
//    存储每一次换完酒剩余的酒瓶和瓶盖static int bottle = 0;static int cap = 0;static int beer(int n){
//        使用当前的酒+酒瓶+瓶盖计算可以换的酒int re_n = (bottle+n)/2 + (cap+n)/4;bottle = (bottle+n)%2;cap = (cap+n)%4;
//        结束条件是换不了酒,那么直接返回,结束递归if(re_n == 0){return n;}return n+beer(re_n);}public static void main(String[] args) {int n = 1;int loop = 500000;do{n++;beer(n);}while(((bottle==1) && (cap==3)) && (n<loop));System.out.println(n);}
}

 测试结果如下,每次都是因为达到了循环次数而退出,如果不加循环次数那么它会一直循环计算。说明每次运行beer()方法后都剩余1个酒瓶,3个瓶盖。

解决思路2

        两个酒瓶换一瓶酒,四个瓶盖可以换一瓶酒,然后一瓶酒是2元,所以一个瓶盖的价值是5角,一个酒瓶的价值是1元,那么相当于我们花5角钱就可以喝到一瓶酒,结果是这样吗,我们看一看如果是6元钱,首先可以买3瓶酒,根据思路1的运行结果,我们知道最后可以喝到7瓶酒,按照5角一瓶酒,6元钱我们不是可以喝12瓶酒吗?哪里出问题了?

        这里就要提到思路1中的最后一句话,每次最后都会剩下1个酒瓶和3个瓶盖,所以我们是有2.5元浪费的,这2.5元换不了酒。所以每次计算需要先减去2.5元,然后再根据5角一瓶,计算最后可以喝多少酒?还要注意:如果钱是11.9,那么只能买5瓶酒,所以要先将输入的浮点数转为2的倍数的整数,也就是说11.9变为10,14.8变为14,代码如下

import java.util.Scanner;public class Money_N_Beer {public static void main(String[] args) {Scanner user = new Scanner(System.in);System.out.print("please input your money:");double real_money = user.nextDouble();
//        将输入的浮点数转为整数,如11.9变成11int int_money = (int)real_money;/*** 虽然已经是整数,但是仍然会存在不够买酒而多余1元,* 所以先除2得到能买酒的数量,然后再乘2转为钱* 所以此时得到的money只会是偶数 0,2,4,6……*/int money = int_money/2*2;//        如果钱不够2元,买不了酒if(money<2) {System.out.println("money is so little, can't buy beer");
//        如果money>=2 && money<4,那么只能买一瓶酒,最后不存在浪费2.5元,要特殊考虑}else if(money<4){System.out.println("beer is " + (money/2));System.out.println("bottle is " + (money/2));System.out.println("cap is " + (money/2));}else {int beer = (int)((money-2.5)/0.5);System.out.println("beer is " + beer);System.out.println("bottle is 1");System.out.println("cap is 3");}}
}

几个测试结果如下

 

    

拓展:如果可以借酒呢?

这个是网页上经常看到的问题,按照我们上面的测试,不管多少瓶酒(大于1瓶酒),最后剩余的酒瓶都是1个,瓶盖都是3个,如果可以借酒,借1瓶酒,那么喝完酒变为2个酒瓶,4个瓶盖。可以换2瓶酒,酒喝完后有2个酒瓶,2个瓶盖,可以用2个酒瓶接着换1瓶酒,喝完后剩余1个酒瓶,3个瓶盖,结束。也就是借1瓶酒,我们可以喝4瓶酒,除去借的,我们可以多喝3瓶酒。如果可以一直借,那么可以一直喝下去。新增代码如下红色框代码

 运行测试结果如下,每一次借酒都会增加3瓶酒

   

现在有N元钱,两块钱一瓶,或者直接给你N瓶酒,两个空瓶换一瓶酒,四个瓶盖换一瓶酒,问你最后可以喝多少瓶?如果能借酒呢?相关推荐

  1. 女大学生两块钱成功进外企

    在一次招聘会上,北京某外企人事经理说,他们本想招一个有丰富工作经验的资深会计人员,结果却破例招了一位刚毕业的女大学生,让他们改变主意的起因只是一个小小的细节:这个学生当场拿出了两块钱.       人 ...

  2. 两块钱买来的常数变易法

    两块钱买来的常数变易法 昨晚回味了一下微分方程,对其中提到的专门解决"一阶线性非齐次微分方程"的"常数变易法"仍不甚理解,网上查了查,免费资源稀缺得可怜,而且有 ...

  3. 上海宝付花两块钱竟帮助了千百人程序人生的梦想

    上海宝付花两块钱竟帮助了千百人的梦想.近日,宝付携手公益组织"图书馆计划",为贵州省遵义市正安县班竹镇的一所乡村小学捐赠了千余本图书,以及一间崭新的阅览室. 这是宝付与图书馆计划开 ...

  4. 这么简单的抓包神器?15块钱?两块钱就搞定!

    0x01 前 今天带各位来了解一下淘宝上卖15+的一个抓包神器,我们剖析一下这个工具. 这个工具的名称叫LAN Tap,是hack5的一个非常简单的开源硬件.别看他叫做神器,其实比之前我们做的BadU ...

  5. “策小编数洞”开工啦,欢迎来唠两块钱儿的

    愁, 数据, 金字塔, 超多指标, 留存率下降, 行为事件分析, 领导让我出报表, 搭建数据分析平台, 不会数据分析怎么办! 让飞天小女警策小编来拯救你,你只需要一个数(树)洞,春天把问题丢进去,秋天 ...

  6. pycharm专业版安装(花了两块钱)

    官网:https://www.jetbrains.com/pycharm/ 安装过程: 自己选择要安装的路径,建议安装路径全英 根据自己的需要,选择需要的,不会挑直接全选 pycharm的激活 打开安 ...

  7. 有一个人有一百块钱, 打算买一百只鸡, 现在大鸡三块钱一只, 小鸡一块钱三只, 不大不小的鸡两块钱一只. Java编程实现,刚好用一百块钱买一百只鸡.

    思路: 对三种鸡从1开始进行for循环,直到找到符合条件的所有的鸡的数量就输出. 代码: public class Chicken {public static void main(String[] ...

  8. JAVA2块钱瓶子_啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶。用java编程解出答案,求大神们帮忙...

    点击查看啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶.用java编程解出答案,求大神们帮忙具体信息 答:package test;public class Test {publ ...

  9. 酒瓶与瓶盖换酒问题 - 10块钱可以喝多少瓶酒

    前些日子有QQ好友发给我下面这个问题: 啤酒2块钱1瓶,4个盖换一瓶,2个空瓶换一瓶,问10块钱可以喝多少瓶. 当时没有时间算这个问题(其实就是懒得动笔和动脑子),但这几天又老想着这个问题,所以今天决 ...

最新文章

  1. 【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )
  2. 新闻频道管理的炫酷实现
  3. Android判断网络连接是否可用【从新浪云搬运】
  4. sqlserver的基本介绍
  5. 三、css 和 js 的装载与执行
  6. 银行利率涨了,定期存款有必要取出再存吗?
  7. 从数据的角度解析计算机的发展,2017计算机知识考前冲刺试题及答案
  8. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)
  9. 剑指offer之矩形覆盖问题
  10. 绝命毒师口语精析(3)
  11. frameset ,iframe的使用
  12. 冷知识 —— 计算机科学及编程
  13. JQuery序列化表单serialize() 以及 serializeArray()
  14. [C# 开发技巧]实现属于自己的截图工具
  15. 3D打印软件——Repetier-Host 简单的使用总结
  16. 计算机主板光驱插口,如何查看笔记本光驱位和主板的SATA接口版本
  17. vector初始化方法(待补充)
  18. 云服务器内存占用多少,腾讯云云服务器CPU或内存占用过高怎么办?
  19. SQL数据库-第一次试验-表与视图的基本操作
  20. 地图比例尺与空间分辨率之间的关系_百度、google、高德 地图比例尺功能实现(算法地图分辨率和zoomlevel之间的关系)...

热门文章

  1. 【MM模块】Subcontracting 委外加工(外包)—2
  2. 【PP操作手册】试制计划
  3. SAP-CO.创建成本中心,作业类型,内部订单
  4. 数据集干货:一文读懂Mapsidejoin
  5. 互联网业务利润增长3倍,TCL电子走出第二增长曲线
  6. 数字化时代,阿里、京东们能否解决困扰市场已久的“倒奶问题”?
  7. 刷抖音对手机有什么要求_6频段全面5G手机 nova6 5G成新年换机最佳之选
  8. linux 权限 mask,Linux mask有效权限详解
  9. powerbi 线性回归_Power BI二月新增图表及课程福利
  10. 动态代理的两种方式_动态代理是基于什么原理?