每天資訊“五家共井”問題的圖形化、Python和APPInventor解法

菜單

“五家共井”問題的圖形化、Python和APPInventor解法

文/王德貴

中國古代數學鉅著《九章算數》是張蒼、耿壽昌所撰寫的一部數學專著。其內容十分豐富,總結了戰國、秦、漢時期的數學成就。是當時世界上最簡練有效的應用數學,它的出現標誌中國古代數學形成了完整的體系。其中有一道題是“五家共井”問題,原文如下:

五家共井,甲二綆不足,如乙一綆;乙三綆不足,如丙一綆;丙四綆不足,如丁一綆;丁五綆不足,如戊一綆;戊六綆不足,如甲一綆,皆及。

這道題的白話解釋是:五家合用一口井,甲家的2根井繩和乙家1根井繩總長為井深;乙家的3根井繩和丙家的1根井繩總長為井深;丙家的4根井繩和丁家1根井繩總長為井深;丁家的5根井繩和戊家1根井繩總長為井深;戊家的6根井繩和甲家1根井繩總長為井深。問:井深、各家井繩各多少?(每家的井繩均等長)

下面我們也來分析一下五家共井問題,並用Python、圖形化和APPInventor分別求解。

一、創意來源

在教授學生學習Python四級課程時,合用的練習和案例並不多,於是在搜尋案例過程中,看到了這個“五家共井”問題,經過研究發現比較適合用Python四級的知識點來解決,現分享出來。

二、設計思路

這是一個不定方程問題。遇到方程最初的想法還是用列舉法,在100範圍內執行後,無果。說明最小正整數解,一定比100大,於是擴大範圍到300,結果執行很久也沒有輸出結果,看來運算時間過長了,沒有能等到程式執行出結果。

於是想到庫函式sympy,它是一個符號計算的Python庫。我在文章《阿基米德群牛問題的分析及Python驗證》裡講過,這裡不再贅述。

透過解方程,得到關係式,從而求出最小正整數解。

在使用Python求解過程中,想試著再用Scratch和APPInventor求解,透過程式設計,執行,在對比三種程式碼之後很有啟發,下面把求解過程分享給大家。

三、程式設計

(一)Python程式設計

1。列舉法

這是一種最直接是思路,不知道具體結果,那就用列舉法測試。

“五家共井”問題的圖形化、Python和APPInventor解法

由於執行時間較長,執行時將消耗時間打印出來了,此時顯示的是運行了a取值1到10的執行時間222秒。

“五家共井”問題的圖形化、Python和APPInventor解法

2。時間複雜度

如果取值範圍在100以內,則時間複雜度是10的10次方,按執行時間算,運行了10個a將近4分鐘,那執行100個a,需要的時間就大約是40分鐘。

“五家共井”問題的圖形化、Python和APPInventor解法

當a的取值在1~300時,執行1個a需要的時間將近30分鐘,那300個a就是近150個小時,需要6天多的時間。

“五家共井”問題的圖形化、Python和APPInventor解法

這樣長的執行時間完全無法實用,必須透過縮減無效運算來最佳化程式。改為根據最短的繩子e作為列舉的主要引數,根據網路搜尋答案,我已經知道e的解小於100,等待一段時間能夠獲得答案。

“五家共井”問題的圖形化、Python和APPInventor解法

執行10個e的時間將近是6分鐘,隨e值增大,單次運算時間還會縮短。最佳化後,執行時間大大縮短了,只需25分鐘左右,已經獲得了一組結果。

“五家共井”問題的圖形化、Python和APPInventor解法

“五家共井”問題的圖形化、Python和APPInventor解法

我們根據已有答案回推最佳化程式,最終獲得了結果。但是如果我們不知道答案的範圍,即使只在300範圍內試算,執行也要6個小時左右。列舉法在面對這樣一個不定方程的情況,如果不知道結果的範圍,那麼執行時間就會非常長!必須去尋找更簡捷的演算法。

3。方程解法的程式設計

(1)利用Sympy庫函式先求出不定方程的關係式

“五家共井”問題的圖形化、Python和APPInventor解法

執行結果:

“五家共井”問題的圖形化、Python和APPInventor解法

因為繩長是整數,所以e一定是76的倍數,因此可以求出最小正整數解:甲:265,乙:191,丙:148,丁:129,戊:76;井深:721。

即甲家井繩長265,乙家井繩長191,丙家井繩長148,丁家井繩長129,戊家井繩長76,井深721。

(二)Scratch程式設計

1。基本思想還是列舉,利用附加條件迴圈。

2。程式說明

注意的是,幾個條件都應該是“與”的關係,4個條件截圖不全。如果滿足條件,則說5秒。

“五家共井”問題的圖形化、Python和APPInventor解法

程式是5重迴圈,每個都是300次,a在最外層,運行了1次,就相當於運行了4重300次,就是300×300×300×300次,用了將近24小時,a要是執行300次,總時長則大約需要300天!

“五家共井”問題的圖形化、Python和APPInventor解法

3。最佳化

必須要最佳化程式,縮小取值範圍。

“五家共井”問題的圖形化、Python和APPInventor解法

執行時間6個e,大約3。5小時,但e越大,相對執行時間會越短,所以總執行時間大大縮短了。

“五家共井”問題的圖形化、Python和APPInventor解法

但是畢竟時間複雜度太大,Scratch執行效率又太低,總時長還是太大,即使用最佳化程式測試結果,也需要兩天左右的時間。

(三)APPInventor程式設計

1。設計思路

在Python測試時,在電腦上執行速度還是很快的了,但在手機上執行,則更依賴於手機的配置,明顯感覺執行的很慢很慢。所以加上了直接驗證的程式程式碼。

2。程式設計及說明

(1)變數和初始化

變數“列舉驗證”是使用列舉法還是驗證資料的轉換開關。

變數“分解列表”是在驗證的時候,分解輸入的資料,並放在列表中,以備程式呼叫。

初始化程式,一是初始化程式為列舉狀態,二是提示先選擇使用“列舉”還是“驗證”。

“五家共井”問題的圖形化、Python和APPInventor解法

(2)列舉

“五家共井”問題的圖形化、Python和APPInventor解法

點選“列舉”按鈕,輸入相關資料。因為驗證時不需要水平佈局4,被程式隱藏,所以使用“列舉”時,必須讓其顯示出來。

(3)驗證

“五家共井”問題的圖形化、Python和APPInventor解法

點選“驗證”即可驗證資料是否正確。驗證資料只需要連續輸入資料,所以將水平佈局4隱藏。並將標籤1的文字做輸入提示。

(4)提交

提交時先讀取是驗證狀態,還是列舉狀態。

然後判斷輸入框是否為空,當不為空時,則執行程式。

“五家共井”問題的圖形化、Python和APPInventor解法

驗證狀態:

先將輸入框的資料分解成列表,再判斷5組資料是否滿足條件。

“五家共井”問題的圖形化、Python和APPInventor解法

如果滿足,則顯示五個對應的資料,並提示:驗證正確,否則提示:驗證錯誤。

“五家共井”問題的圖形化、Python和APPInventor解法

這個執行速度很快。

列舉狀態:

按照提示,先輸入取值範圍和初始值和結束值,然後點選提交即可。 列舉APP介面如下。

“五家共井”問題的圖形化、Python和APPInventor解法

“五家共井”問題的圖形化、Python和APPInventor解法

在75-80範圍內,速度很快,但在75-300範圍內,手機一直在執行過程中沒有反饋,就像宕機了一樣,雖然我知道程式還在後臺執行。但這個執行時間肯定會很久,所以就沒有堅持下去的必要了。判斷滿足條件的5個值,程式碼如下。

“五家共井”問題的圖形化、Python和APPInventor解法

程式進行了最佳化,a的取值由b開始到結束值,而b值由c到結束值,以此類推,d是取e到結束值,而e是從開始值到結束值。這樣執行時間會減少很多,但由於執行速度和時間與手機配置直接相關,所以雖然運算量已經大大減少,還是很難去等一個結果。

“五家共井”問題的圖形化、Python和APPInventor解法

如果滿足條件,則顯示五家的繩長和井深,否則提示在開始值 到結束值範圍內無解。

四、測試與改進

三種方法,經過測試,用Python執行最快,APPInventor最慢(使用最佳化程式仍然無結果輸出),只是APPInventor更直觀些。大家有興趣,可以自行驗證,本文不做贅述,這也是自己的學習心得,有不妥之處,請不吝賜教!