@洋葱头头,我是来拿分的
- import java.util.Scanner;
- /**
- *
- * 1,普通版
- * 给定一个数的可乐数,比如20; 四个可乐盖可换一瓶可乐,两个可乐空瓶可换一瓶可乐; 最后喝了多少瓶可乐?
- * 2,进阶版
- * 已知最后喝了n瓶。能求出买了多少瓶么?
- */
- public class DrinkTest {
- private static Scanner sc = new Scanner(System.in);
- public static void main(String[] args) {
- // 普通版
- System.out.print("请输入可乐数:");
- int num = sc.nextInt();
- System.out.println("可以喝到的可乐总数:" + (num + drinkTotalBySwap(num, num)));
-
- System.out.println("----------------华丽的分隔线----------------");
- // 进阶版
- System.out.print("请输入最后喝到的可乐数:");
- int cokeNum = sc.nextInt(); // 最后喝到的可乐数
- int cokeBuyNum = 0; // 需要买这么多瓶可乐,累加思想
- while (true) {
- cokeBuyNum++; // 如果买这么多瓶可乐(每次+1遍历所有情况)
- // 那么总共能喝到下面这么多瓶可乐
- int cokeNumCanDrink = cokeBuyNum + drinkTotalBySwap(cokeBuyNum, cokeBuyNum);
- // 如果从假设中得到最终可喝到的可乐数大于等于实际输入喝到的可乐数,则表明我们找到了ta到底买了多少瓶可乐
- if (cokeNumCanDrink >= cokeNum) {
- System.out.println("你买了" + cokeBuyNum + "瓶可乐,海量啊兄弟,一次饮胜了呗!");
- break;
- }
- }
- }
- /**
- * 模拟交换过程,根据当前喝完可乐后得到的瓶盖数和空瓶数得到还可以喝多少瓶可乐
- *
- * @param capsNum
- * 当前喝完可乐后得到的瓶盖数
- * @param emptyBoNum
- * 当前喝完可乐后得到的空瓶数
- * @return 返回剩下的瓶盖和空瓶总共可以交换到的可乐数
- */
- public static int drinkTotalBySwap(int capsNum, int emptyBoNum) {
- System.out.println("喝完可乐后剩余的瓶盖" + capsNum + "个," + "空瓶" + emptyBoNum + "个");
- // 通过交换后又得到的新可乐瓶数
- int swapCoke = capsNum / 4 + emptyBoNum / 2;
- System.out.println("当前可以交换获得" + swapCoke + "瓶可乐");
- if (swapCoke > 0) {
- int capsLeftNum = swapCoke + capsNum % 4; // 把交换得到的可乐喝完后,剩下的瓶盖数
- int emptyBoLeftNum = swapCoke + emptyBoNum % 2; // 把交换得到的可乐喝完后,剩下的空数
- // 递归,累加每次交换后有能喝到的可乐数
- return swapCoke + drinkTotalBySwap(capsLeftNum, emptyBoLeftNum);
- } else {
- // 递归截止条件,当剩下的瓶盖数与空瓶不能再交换可乐时,停止交换过程
- System.out.println(""); // 只是控制打印格式,这句忽略ta
- return 0;
- }
- }
- }
复制代码 |