前言

在朋友圈看见了个数学问题,在脑子不够用的情况下,用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

在群里面把问题抛出来之后,有群友给出了更优美的解题方式,思路清晰代码简洁。
20170428000352.jpg

最后修改:2021 年 01 月 12 日
如果觉得我的文章对你有用,请随意赞赏