Python學習-算法-百錢買百雞的問題


百錢買百雞的問題算是一套非常經典的不定方程的問題,題目很簡單:公雞5文錢一只,母雞3文錢一只,小雞3只一文錢,

用100文錢買一百只雞,其中公雞,母雞,小雞都必須要有,問公雞,母雞,小雞要買多少只剛好湊足100文錢。

分析:估計現在小學生都能手工推算這套題,只不過我們用計算機來推算,我們可以設公雞為x,母雞為y,小雞為z,那么我們

         可以得出如下的不定方程,

         x+y+z=100,

         5x+3y+z/3=100,

        下面再看看x,y,z的取值范圍。

        由於只有100文錢,則5x<100 => 0<x<20, 同理  0<y<33,那么z<300

由於此處我們不是數學上研究不等式解法,而是讓計算機為我們計算結果,所有暫不考慮效率問題。於是,從變量上我們便可以看出可以在三個循環中,逐個選出匹配條件。

Python的寫法和循環機制是相當簡單的,以上核心算法只需要一條語句便能計算出來:

循環
1 cock_price,hen_price,chick_price=5,3,1.0/3
2 cock_MaxNum,hen_MaxNum,chick_MaxNum=range(100/cock_price)[1:],range(100/hen_price)[1:],range(int(100/chick_price))[1:]
3 items=[(cock,hen,chick)for cock in cock_MaxNum for hen in  hen_MaxNum[1:] for chick in  chick_MaxNum[1:]
4        if int(cock*cock_price+hen*hen_price+chick*chick_price)==100 and chick%3==0 and cock+hen+chick==100]

這個循環是python的列表推導式-也是個輕量級循環,寫法上就是把輸出放在最左邊(可能是元組,也可能是單個值)For寫在中間(以For key in item這種形式存在),最后加上條件。

那以上算法的總體效果:

View Code
#賦值
cock_price,hen_price,chick_price=5,3,1.0/3
#計算
cock_MaxNum,hen_MaxNum,chick_MaxNum=range(100/cock_price)[1:],range(100/hen_price)[1:],range(int(100/chick_price))[1:]
items=[(cock,hen,chick)for cock in cock_MaxNum for hen in  hen_MaxNum[1:] for chick in  chick_MaxNum[1:]
       if int(cock*cock_price+hen*hen_price+chick*chick_price)==100 and chick%3==0 and cock+hen+chick==100]
#輸出
print('總數:'+str(len(items)))
print('='*32)
print('%-10s%10s%20s' % ('公雞','母雞','小雞'))
print('-'*32)
for c in items:
   print('%-5s%10s%15s' % c)
print('-'*32)
   

如果您有更簡潔高效的寫法,願共分享

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM