华为机试题#汽水瓶【代码通俗易懂】
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 数据范围:输入的正整数满足 1 <= n <= 100
解题思路:
20空水瓶 = 6瓶水(20/3) + 8个空瓶(6瓶水对应的空瓶+兑换汽水剩下的20%3=2个空瓶)
8空瓶 = 2瓶水(8/3) + 4个空瓶(2瓶水对应的空瓶+兑换汽水剩下的8%3=2个空瓶)
4空瓶 = 1瓶水(4/3) + 2个空瓶(1瓶水对应的空瓶+兑换汽水剩下的4%3=1个空瓶)
2空瓶 = 1瓶水 + 0空瓶 --特殊情况,只有剩2空瓶可以想商家借1个空瓶,兑换1瓶汽水,产生的空瓶再还给商家
备注:当剩余空瓶为2时,可以通过借空瓶来兑换1瓶汽水,但是由于借的空瓶必须归还,所以不产生空瓶; 当剩余空瓶为1时,如果向商家借2空瓶兑换1瓶汽水,只能产生1个空瓶,不能偿还商家的2个空瓶。所以当空瓶数小于等于1时,兑换结束。
参考代码如下:
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()){
Integer emptyBottle = scanner.nextInt();
int num = getBottle(0, emptyBottle);
if(num > 0){
System.out.println(num); // 可兑换0瓶汽水不打印
}
}
}
/**
* 递归:叠加每一轮可兑换的汽水数,对每一轮共产生的空瓶进行递归兑换汽水
* @param bottle 汽水的数量
* @param emptyBottle 空水瓶数量
* @return
*/
public static int getBottle(int bottle, int emptyBottle){
int rest = 0; // 初始化本轮总共会产生的空瓶子数
if (emptyBottle <= 1){
return bottle; // 空汽水瓶数量小于等于1,代表即使问商家借一个空水瓶也换不了一瓶汽水
}
if (emptyBottle == 2){
return bottle+1; // 只剩2个空瓶,借一个空瓶换一瓶汽水,以及喝完剩下的空瓶还给商家就结束了,没有多余的空瓶
}
int canBeChangedNum = emptyBottle / 3; // 可以兑换的汽水数,也会产生对应个数的空瓶
int restNum = emptyBottle % 3; // 已有空水瓶兑换汽水后剩下的不能兑换的空瓶子
// 汇总,加上本轮可兑换的汽水数,以及本轮一共会产生的空瓶数
bottle += canBeChangedNum;
rest += canBeChangedNum;
rest += restNum;
return getBottle(bottle, rest);
}
}