天天看點

百錢買百蛋算法百錢買百蛋算法

百錢買百蛋算法

我國古代有一數學書,記載着一道算術題“百錢買百蛋”。題目意是:鴨蛋一個三文錢,鵝蛋一個六文錢,雞蛋一文錢三個,百錢買百蛋,各得幾何。對于這種題目,可以考慮使用不定式方程組求解,可是隻能列兩個方程,卻有三個未知數,顯然沒法求解,隻能另尋它法。

#設鵝蛋、鴨蛋、雞蛋各買x隻、y隻、z隻,于是有:
x + y + z = 100			
6x + 3y + 1/3z = 100

#兩個方程,三個未知數,無解
           

對于這個問題,同宗族的一位退休教師老爺爺做了不少研究,同時結合同鄉幾位資深教師的經驗,整理總結了該問題的一般解法:

  • 調補法
  • 比例法
  • 消元法
百錢買百蛋算法百錢買百蛋算法

老爺爺根據這些解題經驗歸納出尋找調解數的規律,使之能輕松解答各類百錢買百蛋的問題,實在精妙絕倫。這裡我使用排列組合的思想,并嘗試使用程式“暴力”破解答案,Python代碼如下:

#!/usr/bin/python
from itertools import combinations

print("百錢買百蛋求解:")
eggs = list(combinations(range(102),2))
#print (eggs)
for x in eggs:
    chiken_egg = x[0] - 0
    duck_egg = x[1] - x[0] - 1
    goose_egg = 102 - x[1] - 1
    if((duck_egg * 3 + goose_egg * 6 + chiken_egg / 3) == 100):
	    print("雞蛋:%d  鴨蛋:%d  鵝蛋:%d  "%(chiken_egg, duck_egg, goose_egg))
	    print("雞蛋價錢:%d  鴨蛋價錢:%d  鵝蛋價錢:%d  "%(chiken_egg / 3, duck_egg * 3, goose_egg * 6))
	    print(" ")
           

從程式運作結果來看,這道題答案有兩個:

百錢買百蛋算法百錢買百蛋算法

我調整一下題目參數,假設鵝蛋為3文錢一個,鴨蛋1文錢一個,雞蛋1文錢3個,再次運作程式,結果如下:

百錢買百蛋算法百錢買百蛋算法

答案整整有26個,與老爺爺的研究十分契合,不得不再次感慨老爺爺的研究真是惟妙惟肖,妙不可言。