買酒兌換問題

題目:
小明去超市買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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章