前言
在朋友圈看见了个数学问题,在脑子不够用的情况下,用python写了个小东西来计算结果,最后结果和某位大神的结果一致,并且证明了我随便一想的20个是错误的,下面贴出问题及小程序
问题
啤酒2块钱1瓶
4个瓶盖换一瓶
2个空瓶换一瓶
10块钱可以喝几瓶?
分析
通过python的面向对象来方便的解决这个数学问题,创建啤酒(self.beer),瓶盖(self.botcap),空瓶(self.bottle)对象,其中exchange是瓶盖和空瓶兑换啤酒的比例,now代表现在的总量,beer.count代表喝的啤酒总数。
通过递归来一次次的兑换啤酒,获得瓶盖空瓶,最终瓶盖和空瓶不再能兑换啤酒,递归结束。
代码
class beer_problem:
def __init__(self):
self.beer={
'now':0,
'count':0,
'price':2
}
self.botcap={
'now':0,
'exchange':4
}
self.bottle={
'now':0,
'exchange':2
}
self.money=10
self.mainloop()
self.result()
def mainloop(self):
if self.money==0\
and self.botcap['now']<self.botcap['exchange']\
and self.bottle['now']<self.bottle['exchange']:
return
#购买啤酒
if self.money>=self.beer['price']:
self.beer['now']=int(self.money/self.beer['price'])
self.beer['count']=self.beer['now']
print('购买啤酒',self.beer['now'])
self.money=0
self.exchange()
#兑换啤酒
if self.botcap['now']>=self.botcap['exchange']:
tmp=int(self.botcap['now']/self.botcap['exchange'])
self.beer['now']+=tmp
self.beer['count']+=tmp
self.botcap['now']-=tmp*self.botcap['exchange']
print('使用{0}个瓶盖兑换{1}瓶啤酒,还剩{2}个瓶盖'.format(tmp*self.botcap['exchange'],tmp,self.botcap['now']))
self.exchange()
#兑换啤酒
if self.bottle['now']>=self.bottle['exchange']:
tmp=int(self.bottle['now']/self.bottle['exchange'])
self.beer['now']+=tmp
self.beer['count']+=tmp
self.bottle['now']-=tmp*self.bottle['exchange']
print('使用{0}个空瓶兑换{1}瓶啤酒,还剩{2}个空瓶'.format(tmp*self.bottle['exchange'],tmp,self.bottle['now']))
self.exchange()
print()
self.mainloop()
def exchange(self):
if self.beer['now']!=0:
self.botcap['now']+=self.beer['now']
self.bottle['now']+=self.beer['now']
print('喝掉{0}瓶啤酒,获得{0}个瓶盖{0}个空瓶.'.format(self.beer['now']),'现在共有{0}个瓶盖{1}个空瓶.'.format(self.botcap['now'],self.bottle['now']))
self.beer['now']=0
def result(self):
print('剩余瓶盖{0},剩余空瓶{1},共喝了{2}瓶酒'.format(self.botcap['now'],self.bottle['now'],self.beer['count']))
if __name__=='__main__':
beer_problem()
执行结果
购买啤酒 5
喝掉5瓶啤酒,获得5个瓶盖5个空瓶. 现在共有5个瓶盖5个空瓶.
使用4个瓶盖兑换1瓶啤酒,还剩1个瓶盖
喝掉1瓶啤酒,获得1个瓶盖1个空瓶. 现在共有2个瓶盖6个空瓶.
使用6个空瓶兑换3瓶啤酒,还剩0个瓶盖
喝掉3瓶啤酒,获得3个瓶盖3个空瓶. 现在共有5个瓶盖3个空瓶.
使用4个瓶盖兑换1瓶啤酒,还剩1个瓶盖
喝掉1瓶啤酒,获得1个瓶盖1个空瓶. 现在共有2个瓶盖4个空瓶.
使用4个空瓶兑换2瓶啤酒,还剩0个瓶盖
喝掉2瓶啤酒,获得2个瓶盖2个空瓶. 现在共有4个瓶盖2个空瓶.
使用4个瓶盖兑换1瓶啤酒,还剩0个瓶盖
喝掉1瓶啤酒,获得1个瓶盖1个空瓶. 现在共有1个瓶盖3个空瓶.
使用2个空瓶兑换1瓶啤酒,还剩1个瓶盖
喝掉1瓶啤酒,获得1个瓶盖1个空瓶. 现在共有2个瓶盖2个空瓶.
使用2个空瓶兑换1瓶啤酒,还剩0个瓶盖
喝掉1瓶啤酒,获得1个瓶盖1个空瓶. 现在共有3个瓶盖1个空瓶.
剩余瓶盖3,剩余空瓶1,共喝了15瓶酒
最后成功的解决了问题,如果有变形题,可以修改__init__()中设置的数字来计算其他题型。
结束
2016-12-09
在群里面把问题抛出来之后,有群友给出了更优美的解题方式,思路清晰代码简洁。