Java10元喝啤酒_一道有趣的题:10元最多可喝多少瓶啤酒?

16c1befd663d

image.png

请听题:

每瓶啤酒2元,2个空酒瓶或4个瓶盖可换1瓶啤酒。10元最多可喝多少瓶啤酒?

关于答案:网上有非常多的解答。包括:

一步步进行推算

设一瓶酒里的酒价值x,酒瓶价值y,瓶盖价值z,列等式进行计算

跟老板赊账或者借酒瓶或者瓶盖计算

...等等

作为一名程序猿,用笔一步步计算太麻烦了,知道原理,那就写个递归算法计算一波吧。

注:以下为Swift代码

var drinkTotal = 5 // 总共喝的啤酒的数量,初始化为5,即购买的5瓶

var leftBottle = 0 // 剩余空瓶的数量

var leftCover = 0 // 剩余瓶盖的数量

func convert(_ bottle: Int, _ cover: Int) -> Int {

if bottle >= 2 || cover >= 4 {

leftBottle = (bottle / 2) + (bottle % 2) + (cover / 4)

leftCover = (cover / 4) + (cover % 4) + (bottle / 2)

return (bottle / 2) + (cover / 4) + convert(leftBottle, leftCover)

}

return 0

}

drinkTotal += convert(5, 5)

print("\n总共喝了\(drinkTotal)瓶啤酒,还剩下\(leftBottle)个空瓶,\(leftCover)个空盖")

这里不多详细解释了。下面的方案比较详细易懂

// 啤酒信息类

class TurnBeerInfo {

var bottleTotal = 0 // 空瓶的数量

var coverTotal = 0 // 瓶盖的数量

var drinkTotal = 0 // 已喝啤酒的数量

}

// 购买啤酒

func buyBeer(_ money: Int, _ turnBeerInfo: TurnBeerInfo) {

let beerTotal = money / 2

turnBeerInfo.bottleTotal = beerTotal

turnBeerInfo.coverTotal = beerTotal

turnBeerInfo.drinkTotal = beerTotal

}

// 兑换啤酒

func convert(_ turnBeerInfo: TurnBeerInfo, _ i: Int) {

// 用空瓶兑换啤酒的数量

let bottleTurnNum = turnBeerInfo.bottleTotal / 2

// 计算空瓶兑换后的瓶盖数量

turnBeerInfo.coverTotal += bottleTurnNum

// 用瓶盖兑换啤酒的数量

let coverTurnNum = turnBeerInfo.coverTotal / 4

// 重新计算瓶盖兑换后的瓶盖数量

turnBeerInfo.coverTotal = turnBeerInfo.coverTotal % 4 + coverTurnNum

// 重新计算瓶盖兑换后的空瓶数量

turnBeerInfo.bottleTotal = turnBeerInfo.bottleTotal % 2 + bottleTurnNum + coverTurnNum

// 计算总共喝了几瓶

turnBeerInfo.drinkTotal = turnBeerInfo.drinkTotal + coverTurnNum + bottleTurnNum

print("这是第\(i)次兑换,目前已喝了\(turnBeerInfo.drinkTotal)瓶啤酒,还剩下\(turnBeerInfo.bottleTotal)个空瓶,\(turnBeerInfo.coverTotal)个瓶盖")

// 满足条件,继续计算

if turnBeerInfo.bottleTotal >= 2 || turnBeerInfo.coverTotal >= 4 {

let j = i + 1

convert(turnBeerInfo, j)

}

}

let turnBeerInfo = TurnBeerInfo()

let totalMoney = 10

buyBeer(totalMoney, turnBeerInfo)

convert(turnBeerInfo, 1)

print("\n总共喝了\(turnBeerInfo.drinkTotal)瓶啤酒,还剩下\(turnBeerInfo.bottleTotal)个空瓶,\(turnBeerInfo.coverTotal)个空盖")

16c1befd663d

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值