# 买酒兑换问题(Exchange for wine)-其他

## 买酒兑换问题(Exchange for wine)

/**
* 问题描述：小明去超市买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);
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?

/**
* 问题描述：小明去超市买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);