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次,三重就是100100100,太耗時間了,能不能有一種更好的解決方法呢?

方案二:
思路:買了一只公雞,花掉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倍
這個小小的程序可以說明算法的重要性,用不同的算法,時間復雜度是不一樣的。在實現一個功能的基礎上,還要兼顧效率的問題。
當然這個題目還可以用求不定方程整數解的辦法來解決,這個算法用時會更短。

后記

【后記】為了讓大家能夠輕松學編程,我創建了一個公眾號【輕松學編程】,里面有讓你快速學會編程的文章,當然也有一些干貨提高你的編程水平,也有一些編程項目適合做一些課程設計等課題。

也可加我微信【1257309054】,拉你進群,大家一起交流學習。
如果文章對您有幫助,請我喝杯咖啡吧!

公眾號

公眾號

贊賞碼

關注我,我們一起成長~~


免責聲明!

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



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