java程序实现一个有趣的买啤酒问题

一:问题描述

啤酒2元一瓶,4个瓶盖换一瓶啤酒,2个空瓶换一瓶啤酒,问10元能喝几瓶啤酒?

二:问题分析

针对上述问题,分两种情况:一种是有剩余空瓶和瓶盖且不够兑换的情况;另一种是当剩余瓶盖或空瓶不够兑换时,老板可以配合凑够;我们分别来算出喝多少瓶啤酒。【结果为:喝完第15瓶时有剩余1个空瓶3个盖不够兑换;如果老板配合,喝20瓶啤酒正好无剩余瓶盖和空瓶】

三:程序实现

先实现一个啤酒类:

package com.challenge.beer;
public class Beer {
 /**
  * 2元1瓶啤酒
  * 4个盖子换1瓶酒
  * 2个空瓶换1瓶酒
  * 10元可以喝几瓶酒
  */
 public int Money;
 public int Gai;
 public int Empty;
 public int beer;
 
 public int borrowGai;
 public int borrowEmpty;
 int Count1=0,Count2=0; 
 
 public Beer(int money, int gai, int empty, int beer) {
  super();
  Money = money;
  Gai = gai;
  Empty = empty;
  this.beer = beer;
 }
 public Beer(int borrowGai, int borrowEmpty) {
  super();
  this.borrowGai = borrowGai;
  this.borrowEmpty = borrowEmpty;
 }
 
 public void Drink(int money,int gai,int empty){//喝酒函数
  if(money>0){
   beer=money/2;
   Gai=money/2;
   Empty=money/2;
  }else{
   Gai=gai;
   Empty=empty;
  }  
  
  System.out.println("开始喝酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n");
  
  do{
   if(Gai>=4){
    int tmp1=Gai%4;
    int tmp2=(int)Gai/4;
    beer+=tmp2;
    Gai=tmp1+tmp2;
    Empty+=tmp2;
    Count1++;
    System.out.println("第"+Count1+"次瓶盖换酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n"); 
   }
   
   if(Empty>=2){
    int tmp3=(int)Empty/2;//换酒   
    int tmp4=Empty%2;//剩余空瓶
    Gai+=tmp3;//新盖
    Empty=tmp4+tmp3;
       beer+=tmp3;
       Count2++;
    System.out.println("第"+Count2+"次空瓶换酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n");
   }
   System.out.println("喝了:"+beer+"瓶啤酒"+"\n"); 
   
   //判断是否要还空瓶或者瓶盖
   if(borrowGai >0||borrowEmpty>0){
    Return(); 
   }
    
  }while(Gai>=4 || Empty>=2);  
  
  //借瓶盖或者空瓶函数
  Borrow();
 }
 
 public void Borrow(){//借瓶盖或者空瓶函数  
  if(Gai==0 && Empty==0){
   System.out.println("-----OVER!喝酒结束---");
  }else{
   
   if(4-Gai>2-Empty ){ //判断借空瓶还是借盖,借最少优先
    int tmp=2-Empty;
    Empty+=tmp;  //借空瓶
    this.borrowEmpty+=tmp;
    System.out.println("借了:"+this.borrowGai+"个盖;"+tmp+"个空瓶"+"\n"); 
    Drink(0,Gai,Empty);
    
   }else{
    int tmp=4-Gai;
    Gai+=tmp;//借盖
    this.borrowGai+=tmp;
    System.out.println("借了:"+tmp+"个盖;"+"\n"); 
    Drink(0,Gai,Empty);
   }
  }
 }
 
 public void Return(){//规还空瓶/瓶盖函数
  //归还瓶盖
  if(borrowGai>0){
   if(Gai>0&&Gai>=borrowGai){
    Gai-=borrowGai;
    System.out.println("归还:"+this.borrowGai+"个盖;"+"\n"); 
    borrowGai=0;
   }
  }
  //归还空瓶
  if(borrowEmpty>0){
   if(Empty>=borrowEmpty){
    Empty-=borrowEmpty;
    System.out.println("归还:"+this.borrowEmpty+"个空瓶"+"\n"); 
    borrowEmpty=0;
   }
  }  
 }
}

再通过主类调用该类对象:

 package com.challenge.beer;
public class Main {
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Beer p=new Beer(10,0,0,0);
  p.Drink(10,0,0);
 }
}

三:程序输出结果

开始喝酒:瓶盖=5;空瓶=5;啤酒=5瓶

第1次瓶盖换酒:瓶盖=2;空瓶=6;啤酒=6瓶

第1次空瓶换酒:瓶盖=5;空瓶=3;啤酒=9瓶

喝了:9瓶啤酒

第2次瓶盖换酒:瓶盖=2;空瓶=4;啤酒=10瓶

第2次空瓶换酒:瓶盖=4;空瓶=2;啤酒=12瓶

喝了:12瓶啤酒

第3次瓶盖换酒:瓶盖=1;空瓶=3;啤酒=13瓶

第3次空瓶换酒:瓶盖=2;空瓶=2;啤酒=14瓶

喝了:14瓶啤酒

第4次空瓶换酒:瓶盖=3;空瓶=1;啤酒=15瓶

喝了:15瓶啤酒

借了:1个盖;

开始喝酒:瓶盖=4;空瓶=1;啤酒=15瓶

第4次瓶盖换酒:瓶盖=1;空瓶=2;啤酒=16瓶

第5次空瓶换酒:瓶盖=2;空瓶=1;啤酒=17瓶

喝了:17瓶啤酒

归还:1个盖;

借了:0个盖;1个空瓶

开始喝酒:瓶盖=1;空瓶=2;啤酒=17瓶

第6次空瓶换酒:瓶盖=2;空瓶=1;啤酒=18瓶

喝了:18瓶啤酒

归还:1个空瓶

借了:2个盖;

开始喝酒:瓶盖=4;空瓶=0;啤酒=18瓶

第5次瓶盖换酒:瓶盖=1;空瓶=1;啤酒=19瓶

喝了:19瓶啤酒

借了:2个盖;1个空瓶

开始喝酒:瓶盖=1;空瓶=2;啤酒=19瓶

第7次空瓶换酒:瓶盖=2;空瓶=1;啤酒=20瓶

喝了:20瓶啤酒

归还:2个盖;

归还:1个空瓶

-----OVER!喝酒结束---

时间: 2024-08-26 10:45:14

java程序实现一个有趣的买啤酒问题的相关文章

关于java除法的一个有趣例子。

今天逛贴吧的时候偶然发现吧友的一个有趣例子. public class Demo{     public static void main(String[]args){         System.out.println(24/0);  //会抛byzero异常         System.out.println(24.0/0.0) //可以输出,输出为Infinity:     } } 目前对于第二句为什么不会报byzero异常也不知道.先做个标记.理解了再补充上.

使用命令行运行Java程序

我现在身边有好多人在学习java,只要一提到学习java语言,我们马上想到的工具是eclipse,MyEclipse,NetBeans等等. 也许是我们用惯了vc,对集成开发环境有太多的依赖.但是,我个人觉得,对于一个开发人员有必要熟悉各种开发工具,更要尝试最原始的开发工具,即命令行. 同时我还发现用命令行更对java的语法有更深刻的理解,而不是仅仅停留在背诵记忆的层次上. 我们先介绍一下常用的命令: ①cd命令---切换目录:   e.g. cd src ②javac命令---编译java源程

Java程序员面试题集(116-135)

摘要:这一部分讲解基于Java的Web开发相关面试题,即便在Java走向没落的当下,基于Java的Web开发因为拥有非常成熟的解决方案,仍然被广泛应用.不管你的Web开发中是否使用框架,JSP和Servlet都是一个必备的基础,在面试的时候被问到的概率还是很高的. 116.说出Servlet的生命周期,并说出Servlet和CGI的区别? 答:Web 容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化:请求到达时调用 Servl

java服务器浅入浅出之简略的java程序发布

本篇将记录下一个简单的java程序在linux上的部署设置,以及发布脚本的编写.粗糙.简略.  //神奇!勿动 1.首先写了一个简单的java程序,一个死循环,不停地输出一句话. 2.把工程共享到svn上. 3.编写publish_test.sh脚本,实现svn源码的检出,调用ant编译.打包,以及其他准备操作. <span style="font-size:18px;">. /home/testjava/publish/config.sh mkdir -p ${PUBLI

当世界上只剩下一个Java程序员

公元2050年,世界上只剩下了一个Java程序员. 你可能要问了,别的人都去哪儿了?原因很简单, Java没落了. 大约在2030年左右,出现了一个叫做X的语言,它既能做系统级开发(操作系统.数据库.编译器),也能做服务器端的开发,手机端,Web端都不在话下. 更为重要的是,这个新的编程语言和人类的自然语言很接近,无论大人小孩,稍微一学,很快就可以来编程.于是排名前100的语言统统消失了, 程序员们都失业了. Java也不例外,这个昔日的霸主在留下了一堆庞大而复杂的系统以后就不见了. Java程

一个java程序员的真实经历

半路出家的老java程序员的一点感悟 我是一个老java程序员,现在基本告别编码时代了,当然我现在还在写代码,不是为了老板写了,是自己在创业.回想起这么多年的人生路,作为一名老程序员感慨颇多,尤其是作为一名半路出家的程序员,其中的滋味更是感慨万分.下面我就自己说说我的经历,也许会给未来码农一点启发. 首先讲讲我是怎么成为一个程序员的,这个还真要说说中国的教育.我们国家的这种应试教育一直受到很多人的诟病,有的指责扼杀了学生的创造力,有的指责培养出来的学生就像火腿厂生产的香肠,都是一个味毫无特点而言

java编程的一个猜数字有趣小游戏

import javax.swing.Icon; import javax.swing.JOptionPane; public class ai { /** * @param args */ public static void main(String[] args) { Icon icon = null; boolean bl = false; int put = 0; int c = (int) (((Math.random())*100)+1); //获取一个1-100的随机数 Syste

java编程思想笔记--第一个java程序

// Property.java import java.util.*; public class Property { public static void main(String[] args) { System.out.println(new Date()); Properties p = System.getProperties(); p.list(System.out); System.out.println("--- Memory Usage:"); Runtime rt

做一个拥有自己站点的java程序员

有个事情和大家分享下,有个自己做了三年java开发的人问我,说想建一个博客类型的网站,主要发表个人的文章,然后用户可以留言,大概就是这么个简单的东西,应该怎么去做.我耐心的和他解释道,应该按照什么样的步骤去做,我解释完后满以为他已经完全懂了,毕竟就这么点东西,很多不是搞技术开发的人,像前十年前的很多站长都是拿本书自学和不断的在百度,很多建的站都是风生水起,我觉得程序员是自带建站光环的,所以解释完毕后以为就功德圆满了.过了一段时间,这个人又找到我,并发给我了一个ip地址,说个人站建好了,叫我看看并