买酒兑换问题(Exchange for wine)

题目:
小明去超市买5瓶啤酒,喝完后,一个瓶子可以分成一个瓶盖和瓶子,四个瓶盖可以换一瓶新酒,两个瓶子可以换一瓶新酒,那么小明买5瓶酒最后一共可以喝多少瓶啤酒?

答案

/**
 * 问题描述:小明去超市买5瓶啤酒,喝完后,一个瓶子可以分成一个瓶盖和瓶子,
 * 四个瓶盖可以换一瓶新酒,两个瓶子可以换一瓶新酒,那么小明买5瓶酒最后一共可以喝多少瓶啤酒?
 */

/**
 * 计算能喝的啤酒总瓶数
 * @param {*} buyBeerCount 购买的啤酒数量
 */
var calcTotalDrinkBeerCount = function (buyBeerCount) {
  /** 记录喝过的总啤酒数 */
  var totalBeerCount = 0;
  /** 盖子兑换率,4个盖子换一瓶酒 */
  var capRate = 4;
  /** 瓶子兑换率,2个瓶子换一瓶酒 */
  var bottleRate = 2;

  /**
   * 根据现有啤酒数量,现有瓶盖数量,现有瓶子数量计算可以兑换的新的啤酒数
   * @param {*} beerCount 现有啤酒数量
   * @param {*} capCount 现有瓶盖数量
   * @param {*} bottleCount 现有瓶子数量
   * @returns
   */
  var calcExchangeBeer = function (beerCount, capCount, bottleCount) {
    /**
     * 退出递归条件:
     * 1. 啤酒数量为 0
     * 2. 瓶盖数量不够兑换啤酒
     * 3. 瓶子数量不够兑换啤酒
     */
    if (beerCount === 0 && capCount < capRate && bottleCount < bottleRate) {
      console.log("不够兑换,计算结束");
      return;
    }
    // 如果有整瓶啤酒,则把整瓶啤酒转换为瓶子和啤酒盖,并记录到喝过的总数
    if (beerCount > 0) {
      // 记录总数
      totalBeerCount += beerCount;
      capCount += beerCount;
      bottleCount += beerCount;
      // 啤酒喝了,清空
      beerCount = 0;
    }
    console.log("把【啤酒】转换为【瓶子】和【啤酒盖】:");
    console.log(
      "已喝啤酒数:" +
        totalBeerCount +
        ",啤酒数:" +
        beerCount +
        ",盖子数:" +
        capCount +
        ",空瓶子数:" +
        bottleCount
    );

    // 把能转换的盖子转换为啤酒
    if (capCount >= capRate) {
      beerCount += Math.floor(capCount / capRate);
      // 剩余瓶盖数
      capCount = capCount % capRate;
    }

    // 把能转换的瓶子转换为啤酒
    if (bottleCount >= bottleRate) {
      beerCount += Math.floor(bottleCount / bottleRate);
      bottleCount = bottleCount % bottleRate;
    }

    console.log("把【瓶子】和【啤酒盖】转换为【啤酒】:");
    console.log(
      "已喝啤酒数:" +
        totalBeerCount +
        ",啤酒数:" +
        beerCount +
        ",盖子数:" +
        capCount +
        ",空瓶子数:" +
        bottleCount
    );
    calcExchangeBeer(beerCount, capCount, bottleCount);
  };

  console.log("初始值:");
  console.log("啤酒数:" + buyBeerCount + ",盖子数:" + 0 + ",空瓶子数:" + 0);
  calcExchangeBeer(buyBeerCount, 0, 0);
  console.log("总共可以喝【" + totalBeerCount + "】瓶啤酒");
};

calcTotalDrinkBeerCount(5);

————————

Title:
Xiao Ming goes to the supermarket to buy five bottles of beer. After drinking, a bottle can be divided into a bottle cap and a bottle. Four bottle caps can be replaced with a new bottle of wine, and two bottles can be replaced with a new bottle of wine. So how many bottles of beer can Xiao Ming drink when he buys five bottles of wine?

answer

/**
 * 问题描述:小明去超市买5瓶啤酒,喝完后,一个瓶子可以分成一个瓶盖和瓶子,
 * 四个瓶盖可以换一瓶新酒,两个瓶子可以换一瓶新酒,那么小明买5瓶酒最后一共可以喝多少瓶啤酒?
 */

/**
 * 计算能喝的啤酒总瓶数
 * @param {*} buyBeerCount 购买的啤酒数量
 */
var calcTotalDrinkBeerCount = function (buyBeerCount) {
  /** 记录喝过的总啤酒数 */
  var totalBeerCount = 0;
  /** 盖子兑换率,4个盖子换一瓶酒 */
  var capRate = 4;
  /** 瓶子兑换率,2个瓶子换一瓶酒 */
  var bottleRate = 2;

  /**
   * 根据现有啤酒数量,现有瓶盖数量,现有瓶子数量计算可以兑换的新的啤酒数
   * @param {*} beerCount 现有啤酒数量
   * @param {*} capCount 现有瓶盖数量
   * @param {*} bottleCount 现有瓶子数量
   * @returns
   */
  var calcExchangeBeer = function (beerCount, capCount, bottleCount) {
    /**
     * 退出递归条件:
     * 1. 啤酒数量为 0
     * 2. 瓶盖数量不够兑换啤酒
     * 3. 瓶子数量不够兑换啤酒
     */
    if (beerCount === 0 && capCount < capRate && bottleCount < bottleRate) {
      console.log("不够兑换,计算结束");
      return;
    }
    // 如果有整瓶啤酒,则把整瓶啤酒转换为瓶子和啤酒盖,并记录到喝过的总数
    if (beerCount > 0) {
      // 记录总数
      totalBeerCount += beerCount;
      capCount += beerCount;
      bottleCount += beerCount;
      // 啤酒喝了,清空
      beerCount = 0;
    }
    console.log("把【啤酒】转换为【瓶子】和【啤酒盖】:");
    console.log(
      "已喝啤酒数:" +
        totalBeerCount +
        ",啤酒数:" +
        beerCount +
        ",盖子数:" +
        capCount +
        ",空瓶子数:" +
        bottleCount
    );

    // 把能转换的盖子转换为啤酒
    if (capCount >= capRate) {
      beerCount += Math.floor(capCount / capRate);
      // 剩余瓶盖数
      capCount = capCount % capRate;
    }

    // 把能转换的瓶子转换为啤酒
    if (bottleCount >= bottleRate) {
      beerCount += Math.floor(bottleCount / bottleRate);
      bottleCount = bottleCount % bottleRate;
    }

    console.log("把【瓶子】和【啤酒盖】转换为【啤酒】:");
    console.log(
      "已喝啤酒数:" +
        totalBeerCount +
        ",啤酒数:" +
        beerCount +
        ",盖子数:" +
        capCount +
        ",空瓶子数:" +
        bottleCount
    );
    calcExchangeBeer(beerCount, capCount, bottleCount);
  };

  console.log("初始值:");
  console.log("啤酒数:" + buyBeerCount + ",盖子数:" + 0 + ",空瓶子数:" + 0);
  calcExchangeBeer(buyBeerCount, 0, 0);
  console.log("总共可以喝【" + totalBeerCount + "】瓶啤酒");
};

calcTotalDrinkBeerCount(5);