解题思路:主要思想是空瓶、盖子换成钱继续运算,空瓶每2个才能换成2元(一瓶酒),盖子每4个才能换成2元(一瓶酒)。用全局变量(totalNumbers)记录总共喝酒的数量;全局变量(lastBottlesNumber)记录每次换完剩余的空瓶,全局变量(lastCoverNumber)记录每次换完剩余的盖子。
流程解析:
- 将钱换成酒;将换成的酒喝掉(统计进总共酒的数量)
- 统计剩余的空瓶和盖子
- 将空瓶和盖子换成钱,并统计好不够这次越换剩余的数量。
- 将换成的钱再去买酒(进入下一次循环)
- 循环结束:返回统计的剩余酒瓶数量
下面是代码的逐句解析:
public class Test1 {
public static int totalNumbers;//喝到的酒数量
public static int lastBottlesNumber;//每次换完剩余的空瓶数量
public static int lastCoverNumber;//每次换完剩余的盖子数量
public static void main(String[] args) {
//啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶?
System.out.println(f(10));
}
public static int f(int money) {
//用钱换酒
int Bottles = money / 2;
//统计酒的总数,把这次换的酒加上
totalNumbers += Bottles;
//得到剩余的瓶数和盖数
lastBottlesNumber = Bottles + lastBottlesNumber;
lastCoverNumber = Bottles + lastCoverNumber;
//用来存储,空瓶和盖子换成的钱,只能一次换成2元
int allMoney = 0;
if (lastBottlesNumber >= 2) {//当剩的空瓶够换,就换
allMoney += (lastBottlesNumber / 2) * 2;//加上空瓶换成的钱
lastBottlesNumber = lastBottlesNumber % 2;//换完剩的瓶子
}
if (lastCoverNumber >= 4) {//当省的盖子够换,就换
allMoney += (lastCoverNumber / 4) *2;//加上盖子换成的钱
lastCoverNumber = lastCoverNumber % 4;//换完剩的盖子
}
//如果钱够2元买酒,就继续换
if (allMoney>=2){
f(allMoney);
}
//换完了返回总共换的酒数量
return totalNumbers;
}
}