百錢買百雞的問題算是一套非常經典的不定方程的問題,題目很簡單:公雞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)

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