问题描述
- 啤酒一瓶2元,二个空瓶可以换一瓶啤酒,四个瓶盖也可以换一瓶啤酒,现在有10元钱,可以最多喝几瓶啤酒
- 怎么写java程序实现下面的问题:
啤酒一瓶2元,二个空瓶可以换一瓶啤酒,四个瓶盖也可以换一瓶啤酒,现在有10元钱,可以最多喝几瓶啤酒
解决方案
少年 试试看看
public static int getbeer(int num)
{
int sum = num;//初始化总数
//瓶数大于等于2时,可以换
while(num>=2)
{
//新一次更换后总瓶数为更换前瓶数与瓶数/2的和
sum=sum+num/2;
//这是为了保证不会因为奇数瓶摩2少掉一个空瓶
if(num%2==1)
sum++;
num=num/2;
}
//这就是结果
return sum;
}
解决方案二:
这道题根本没有编程的必要,因为它不具备普适性。
可以考虑把单价,钱,换取规则都作为输入,最终可以喝的啤酒瓶数作为输出。
解决方案三:
public static int Drink(int nint dint pint total){
int drink = n>>1;
int leftd = d + drink%2;
int leftp = p + drink%4;
int s = drink>>1;
int f = drink>>2;
if(s>0||f>0){
total = Drink(drink leftd leftptotal);
}
return total + drink + s + f ;
}
public static void main(String[] args) {
System.out.println(Drink(10 0 0 0));
}
解决方案四:
方法内那么多变量会影响虚拟机执行效率 写注释是个好习惯 代码里不该出现实数的
解决方案五:
public class BeerGame { /** * 啤酒总数 */ private static int beerNum = 0; /** * 每次增加的啤酒数,包括购买的,用空瓶换取以及瓶盖换取 */ private static int addBeerNum = 0; /** * 当前空瓶数 */ private static int bottleNum = 0; /** * 当前瓶盖数 */ private static int libNum = 0; public static void main(String[] args) { //首次购买增加啤酒数 addBeerNum = 10 >> 1; //啤酒数目增加后依次更改啤酒总数、当前空瓶数以及当前瓶盖数 afterAddBeerNumChange(addBeerNum); //判断当前空瓶数或瓶盖数是否支持继续兑换 while(bottleNum >= 2 || libNum >= 4){ //空瓶数大于2时可兑换 if (bottleNum >= 2) { //获取兑换啤酒数 addBeerNum = bottleNum >> 1; //更改当前空瓶数 bottleNum = bottleNum % 2; //修改啤酒总数、当前空瓶数以及当前瓶盖数 afterAddBeerNumChange(addBeerNum); } //瓶盖数大于4时可兑换 if (libNum >= 4) { //获取兑换啤酒数 addBeerNum = libNum >> 2; //更改当前瓶盖数 libNum = libNum % 4; //修改啤酒总数、当前空瓶数以及当前瓶盖数 afterAddBeerNumChange(addBeerNum); } } } /** * 啤酒数目增加后操作,依次更改啤酒总数、当前空瓶数以及当前瓶盖数 * @param addBeerNum 增加啤酒数 */ private static void afterAddBeerNumChange(int addBeerNum){ beerNum += addBeerNum; bottleNum += addBeerNum; libNum += addBeerNum; System.out.println(""beerNum = "" + beerNum + "" bottleNum = "" + bottleNum + "" libNum = "" + libNum); }}
欢迎批评指正
解决方案六:
/** * * * @param args */ public static int all = 5; public static int leftBottle; public static int leftTop; public static void main(String[] args) { all += drink(55); System.out.println(""总共能喝""+all); System.out.println(""剩下酒瓶个数""+leftBottle); System.out.println(""剩下盖子个数""+leftTop); } public static int drink(int bottle int top) { if(bottle >=2 || top >=4){ leftBottle = (bottle/2) + (bottle%2) + (top/4); leftTop = (top/4) + (top%4) + (bottle/2); return (bottle/2) + (top/4) + drink(leftBottleleftTop); } return 0; }
在网上看到的一个解决方法,我觉得挺棒的
解决方案七:
public static int drink(int dint pint total){
int leftd = d%2; //剩余空瓶数
int leftp = p%4; //剩余瓶盖数
int s = d>>1; //空瓶兑酒数
int f = p>>2; //空盖兑酒数
if(s>0||f>0){
total = drink(leftd+s+f leftp+s+ftotal);
}
return total + s + f ;
}
public static int input(int n){
return drink( n>>1 n>>1 n>>1);
}
public static void main(String[] args) {
System.out.println(input(10));
}