转载请注明出处:http://blog.csdn.net/li396864285/article/details/51519786
【原创】10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶,经典算法原题目:10元钱去买啤酒,2个空瓶可兑换一瓶,4个瓶盖可兑换一瓶,请问总共能喝多少瓶?
</pre><pre code_snippet_id="1699391" snippet_file_name="blog_20160527_1_8970255" name="code" class="java">//10元钱买5瓶啤酒,2个瓶盖换一瓶,4个空瓶换一瓶,10钱到底能买多少瓶啤酒?
/**
* Created by lee on 2016/5/27.
*/
public class BottleTest {
public static void main(String[] args){
int yourMoney = 10;
TurnBeerInfo turnBeerInfo = new TurnBeerInfo();
buyBeer(turnBeerInfo,yourMoney);
int i = 0;
while(turnBeerInfo.bottleNum>=2||turnBeerInfo.coverNum>=4){
compute(turnBeerInfo,++i);
}
System.out.println("总共喝过"+turnBeerInfo.drinkSumNum+"瓶啤酒,还剩下"+turnBeerInfo.bottleNum+"个瓶子,"
+turnBeerInfo.getCoverNum()+"个瓶盖");
}
public static void buyBeer(TurnBeerInfo turnBeerInfo,int money){
int beerNum = money/2;
turnBeerInfo.drinkSumNum = beerNum;
turnBeerInfo.bottleNum = beerNum;
turnBeerInfo.coverNum = beerNum;
}
public static void compute(TurnBeerInfo turnBeerInfo,int i){
System.out.println("第"+i+"次兑换,您目前总共喝过"+turnBeerInfo.drinkSumNum+"瓶啤酒,还剩下"+turnBeerInfo.bottleNum+"个瓶子,"
+turnBeerInfo.getCoverNum()+"个瓶盖");
if(turnBeerInfo.bottleNum/2>0){
int bottleTurnNum =turnBeerInfo.bottleNum/2;//用瓶子兑换了bottleTurnNum瓶酒,又产生了bottleTurnNum个瓶子,bottleTurnNum个盖子
turnBeerInfo.drinkSumNum += bottleTurnNum;//1:累加喝过啤酒总数
turnBeerInfo.coverNum += bottleTurnNum;//2:累加瓶盖数量
turnBeerInfo.bottleNum = turnBeerInfo.bottleNum%2+bottleTurnNum;//3:重新计算剩余瓶子数量,请记得把刚兑换的酒产生的瓶子,也及时累加
}
if(turnBeerInfo.coverNum/4>0){
int coverTurnNum = turnBeerInfo.coverNum/4;//用盖子兑换了coverTurnNum瓶酒,又产生了coverTurnNum个瓶子,coverTurnNum个盖子
turnBeerInfo.drinkSumNum += coverTurnNum;//1:累加喝过啤酒总数
turnBeerInfo.bottleNum += coverTurnNum;//2:累加瓶子数量
turnBeerInfo.coverNum = turnBeerInfo.coverNum%4+coverTurnNum;//3:重新计算剩余瓶盖数量,请记得把刚兑换的酒产生的盖子,也及时累加
}
return ;
}
public static class TurnBeerInfo{
private int bottleNum;//剩余瓶子数量,2个瓶子可换1瓶啤酒
private int coverNum;//剩余的盖子数量,4个盖子可换1瓶啤酒
private int drinkSumNum;
public int getBottleNum() {
return bottleNum;
}
public void setBottleNum(int bottleNum) {
this.bottleNum = bottleNum;
}
public int getCoverNum() {
return coverNum;
}
public void setCoverNum(int coverNum) {
this.coverNum = coverNum;
}
public int getDrinkSumNum() {
return drinkSumNum;
}
public void setDrinkSumNum(int drinkSumNum) {
this.drinkSumNum = drinkSumNum;
}
}
}
请参考以上代码,其中关键点是计算时,第3步骤,一定记得把刚兑换的酒产生的瓶子和盖子放入余数中。
现在,你可以很清楚地知道,当你有10元钱,你最多可以喝多少瓶:
第1次兑换,您目前总共喝过5瓶啤酒,还剩下5个瓶子,5个瓶盖
第2次兑换,您目前总共喝过8瓶啤酒,还剩下4个瓶子,4个瓶盖
第3次兑换,您目前总共喝过11瓶啤酒,还剩下3个瓶子,3个瓶盖
第4次兑换,您目前总共喝过13瓶啤酒,还剩下3个瓶子,1个瓶盖
第5次兑换,您目前总共喝过14瓶啤酒,还剩下2个瓶子,2个瓶盖
总共喝过15瓶啤酒,还剩下1个瓶子,3个瓶盖
假如你有12元,最多可以喝到多少瓶:
第1次兑换,您目前总共喝过6瓶啤酒,还剩下6个瓶子,6个瓶盖
第2次兑换,您目前总共喝过11瓶啤酒,还剩下5个瓶子,3个瓶盖
第3次兑换,您目前总共喝过14瓶啤酒,还剩下4个瓶子,2个瓶盖
第4次兑换,您目前总共喝过17瓶啤酒,还剩下3个瓶子,1个瓶盖
第5次兑换,您目前总共喝过18瓶啤酒,还剩下2个瓶子,2个瓶盖
总共喝过19瓶啤酒,还剩下1个瓶子,3个瓶盖
很神奇吧。