百錢買百蛋算法
我國古代有一數學書,記載着一道算術題“百錢買百蛋”。題目意是:鴨蛋一個三文錢,鵝蛋一個六文錢,雞蛋一文錢三個,百錢買百蛋,各得幾何。對于這種題目,可以考慮使用不定式方程組求解,可是隻能列兩個方程,卻有三個未知數,顯然沒法求解,隻能另尋它法。
#設鵝蛋、鴨蛋、雞蛋各買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個,與老爺爺的研究十分契合,不得不再次感慨老爺爺的研究真是惟妙惟肖,妙不可言。