怎么写java程序实现下面的问题:
啤酒一瓶2元,二个空瓶可以换一瓶啤酒,四个瓶盖也可以换一瓶啤酒,现在有10元钱,可以最多喝几瓶啤酒
public static int Drink(int n,int d,int p,int 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, leftp,total);
}
return total + drink + s + f ;
}
public static void main(String[] args) {
System.out.println(Drink(10, 0, 0, 0));
}
少年 试试看看
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 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(5,5);
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(leftBottle,leftTop);
}
return 0;
}
在网上看到的一个解决方法,我觉得挺棒的
public static int drink(int d,int p,int 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+f,total);
}
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));
}