小朋友們好,大朋友們好!
我是貓妹,一名愛上Python編程的小學(xué)生。
歡迎和貓妹一起,趣味學(xué)Python。
今日主題
你知道我國歷史上有個王朝叫北魏嗎?

北魏(386年—534年),南北朝時期北朝的第一王朝。
也稱“后魏”“拓跋魏”“元魏”,鮮卑族拓跋氏所建,傳12帝(列入正史帝紀者)?

你知道北魏王朝有個著名的數(shù)學(xué)家叫張丘建嗎?
他從小聰明好學(xué),酷愛算術(shù)。
一生從事數(shù)學(xué)研究,造詣很深。
“百雞問題”是中古時期,關(guān)于不定方程正整數(shù)解的典型問題,邱建對此有精湛和獨到的見解。
著有《張邱建算經(jīng)》3卷。后世學(xué)者北周甄鸞、唐李淳風相繼為該書作了注釋。劉孝孫為算經(jīng)撰了細草。
算經(jīng)的體例為問答式,條理精密,文詞古雅,是中國古代數(shù)學(xué)史上的杰作,也是世界數(shù)學(xué)資料庫中的一份遺產(chǎn)。
你知道張丘建的代表作《算經(jīng)》嗎?
你知道《算經(jīng)》中有個著名的數(shù)學(xué)問題叫百雞百錢嗎?
雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?
公雞5文錢一只,母雞3文錢一只,小雞3只一文錢。用100文錢,買100只雞。問公雞、母雞、小雞各多少只?
方程解法
如果上了初中,應(yīng)該會學(xué)到方程,這個問題可以用方法來求解。
未知數(shù)稱為元,未知數(shù)的冪稱為次。
假設(shè)公雞、母雞、小雞分別為x、y、z只。
由題可得以下方程:
① x+y+z=100 (雞的總數(shù)量為100只)
② 5x+3y+1/3z=100 (雞的總價格為100文)
根據(jù)以上方程,可以得到以下解:
7x+4y=100
本質(zhì)上是二元一次方程的整數(shù)解問題。
x大于等于0,小于等于20
y大于等于0,小于等于33
x=(100-4y)/7
y=(100-7x)/4
化簡得x<=14 y<=25,然后x依次0~14逐一取值計算進行驗證判斷即可。

二元一次方程的整數(shù)解屬于初中數(shù)學(xué)問題:

答案是3組
Python遍歷解法
在Python編程中,通過窮舉法的方式找出所有解法。
枚舉公雞的數(shù)量x=0~20,步長為1。
在枚舉公雞數(shù)量x的前提下,枚舉母雞的數(shù)量y=0~33,步長為1。
根據(jù)x和y的值,計算出小雞的數(shù)量z=100-x-y。
判斷當前三種雞的數(shù)量是否符合條件,即5x+3y+z/3=100,如果符合,則輸出當前解法。
for x in range(0, 21):
? ? for y in range(0, 34):
? ? ? ? z = 100 - x - y
? ? ? ? if 5*x + 3*y + z/3 == 100:
? ? ? ? ? ? print("公雞:%d只,母雞:%d只,小雞:%d只" % (x, y, z))
公雞:0只,母雞:25只,小雞:75只
公雞:4只,母雞:18只,小雞:78只
公雞:8只,母雞:11只,小雞:81只
公雞:12只,母雞:4只,小雞:84只
程序用了兩層循環(huán),其實還可以用一層循環(huán),此時理解起來稍微麻煩些,但是運行效率會更高效一些。
for x in range(0, 21):
? ? y = 25 - 7*x/4
? ? z = 75 + 3*x/4
? ? if x%4==0 and y >=0:
? ? ? ? print("公雞:%d只,母雞:%d只,小雞:%d只" % (x, y, z))
公雞:0只,母雞:25只,小雞:75只
公雞:4只,母雞:18只,小雞:78只
公雞:8只,母雞:11只,小雞:81只
公雞:12只,母雞:4只,小雞:84只
窮舉法
所謂窮舉法,從可能得解的集合中一一枚舉各元素,用題目給定的檢驗條件判定哪些是無用的,哪些是有用的。
由于窮舉法需要遍歷所有元素,因此它的時間性能往往是最低的,指數(shù)級的時間開銷往往都是采用窮舉帶來的,但是它依舊是很重要的算法設(shè)計思想。理論上,窮舉法可以解決許多計算領(lǐng)域的問題(只要機器性能足夠或者時間開銷可承受)。
百錢買百雞問題是一道經(jīng)典的數(shù)學(xué)問題,通過方程解法和編程解法,可以找出所有符合條件的解法。
方程解法適用于小規(guī)模的問題,對于大規(guī)模的問題,可以使用編程解法進行計算。
編程解法使用窮舉的方式,可以找出所有解法,但計算量較大,需要耗費一定時間和計算資源。
對于現(xiàn)在的計算機來說,這都不是事兒!
好了,我們今天就學(xué)到這里吧!
如果遇到什么問題,咱們多多交流,共同解決。
我是貓妹,咱們下次見!