1. 程式人生 > >python解決百錢買百雞

python解決百錢買百雞

百錢買百雞:現有100錢,公雞5文錢一隻,母雞3文錢一隻,小雞一文錢3只
要求:公雞、母雞,小雞都要有,把100文錢花完,買的雞的數量正好是100。
問:一共能買多少隻公雞,多少隻母雞,多少隻小雞?

窮舉法:
方案一:
思路:
第一重迴圈公雞從1只迴圈到100只
第二重迴圈母雞從1只迴圈到100只
第三重迴圈小雞從1只迴圈到100只
然後進行判斷:
數量:公雞+母雞+小雞 =100
錢:公雞*5+母雞*3+小雞 =100
輸出滿足條件的情況

程式碼如下:

for cock in range(1,101):   # 公雞
    for hen in range(1,101):  #母雞
        for
chick in range(1,101): #小雞 if cock * 5 + hen * 3 + chick == 100: if cock + hen + chick * 3 == 100: print("公雞有%d只\t母雞有%d只\t小雞有%d只"%(cock,hen,chick * 3))

輸出:
公雞有4只 母雞有18只 小雞有78只
公雞有8只 母雞有11只 小雞有81只
公雞有12只 母雞有4只 小雞有84只

雖然能求出結果,但仔細一想,用了三重迴圈,每重迴圈要執行100次,三重就是100*100*100,太耗時間了,能不能有一種更好的解決方法呢?

方案二:
思路:買了一隻公雞,花掉5錢,還剩下100 - 5 = 95 錢,買母雞和小雞的錢只有95錢,而不是100錢。再買一隻母雞,還剩下100- 5 - 3 = 92錢,那麼買小雞的錢只有92錢……所以每重循壞次數不再是固定的100,而是變化的。
第一重 cock:100 / 5 = 20 次
第二重 hen:(100 - cock) / 3次
第三重:100 - cock -hen 次
程式碼如下:

for cock in range(5,101,5):   # 公雞
    for hen in range(3,101 - cock,3):  #母雞
        for chick in range(1
,101 - cock - hen): #小雞 if cock // 5 + hen // 3 + chick * 3 == 100 and cock + hen + chick == 100: print("公雞有%d只\t母雞有%d只\t小雞有%d只" % (cock // 5, hen // 3, chick * 3))

下面做一個時間對比:

import time
start = time.clock()
for cock in range(1,101):   # 公雞
    for hen in range(1,101):  #母雞
        for chick in range(1,101):  #小雞
            if cock * 5 + hen * 3 + chick == 100 and cock + hen + chick * 3 == 100:
                pass
end = time.clock()
time1 = end - start
print("方案一所花時間",time1)
start = time.clock()
for cock in range(5,101,5):   # 公雞
    for hen in range(3,101 - cock,3):  #母雞
        for chick in range(1,101 - cock - hen): #小雞
            if cock // 5 + hen // 3 + chick * 3 == 100 and cock + hen + chick == 100:
               pass

end = time.clock()
time2 = end - start
print("方案二所花時間",time2)
print("方案一所花時間是方案二的%d倍"%(time1 // time2))

輸出:
方案一所花時間 0.32884016429388524
方案二所花時間 0.0030011999201297046
方案一所花時間是方案二的109倍

經過多次測試,方案一所花時間差不多是方案二的100倍
這個小小的程式可以說明演算法的重要姓,用不同的演算法,時間複雜度是不一樣的。在實現一個功能的基礎上,還要兼顧效率的問題。
當然這個題目還可以用求不定方程整數解的辦法來解決,這個演算法用時會更短。