• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      “五家共井”問(wèn)題的圖形化、Python和APPInventor解法

      2021-09-27 18:53王德貴
      電腦報(bào) 2021年37期
      關(guān)鍵詞:程序設(shè)計(jì)程序優(yōu)化

      王德貴

      中國(guó)古代數(shù)學(xué)巨著《九章算術(shù)》是張蒼、耿壽昌所撰寫(xiě)的一部數(shù)學(xué)專著。其內(nèi)容十分豐富,總結(jié)了戰(zhàn)國(guó)、秦、漢時(shí)期的數(shù)學(xué)成就。是當(dāng)時(shí)世界上最簡(jiǎn)練有效的應(yīng)用數(shù)學(xué),它的出現(xiàn)標(biāo)志著中國(guó)古代數(shù)學(xué)形成了完整的體系。其中有一道題是“五家共井”問(wèn)題,原文如下:

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

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

      下面我們也來(lái)分析一下“五家共井”問(wèn)題,并用Python、圖形化和APPInventor分別求解。

      一、創(chuàng)意來(lái)源

      在教授學(xué)生學(xué)習(xí)Python四級(jí)課程時(shí),合用的練習(xí)和案例并不多,于是在搜索案例過(guò)程中,看到了這個(gè)“五家共井”問(wèn)題,經(jīng)過(guò)研究發(fā)現(xiàn)比較適合用Python四級(jí)的知識(shí)點(diǎn)來(lái)解決,現(xiàn)分享出來(lái)。

      二、設(shè)計(jì)思路

      這是一個(gè)不定方程問(wèn)題。遇到方程最初的想法還是用枚舉法,在100范圍內(nèi)運(yùn)行后,無(wú)果。說(shuō)明最小正整數(shù)解,一定比100大,于是擴(kuò)大范圍到300,結(jié)果運(yùn)行很久也沒(méi)有輸出結(jié)果,看來(lái)運(yùn)算時(shí)間過(guò)長(zhǎng)了,沒(méi)有能等到程序運(yùn)行出結(jié)果。

      于是想到庫(kù)函數(shù)sympy,它是一個(gè)符號(hào)計(jì)算的Python庫(kù)。我在文章《阿基米德群牛問(wèn)題的分析及Python驗(yàn)證》里講過(guò),這里不再贅述。

      通過(guò)解方程,得到關(guān)系式,從而求出最小正整數(shù)解。

      在使用Python求解過(guò)程中,想試著再用Scratch和APPInventor求解,通過(guò)編程,運(yùn)行,在對(duì)比三種代碼之后很有啟發(fā),下面把求解過(guò)程分享給大家。

      三、程序設(shè)計(jì)

      (一)Python程序設(shè)計(jì)

      1.枚舉法

      這是一種最直接的思路,不知道具體結(jié)果,那就用枚舉法測(cè)試(圖1)。根據(jù)題意,設(shè)甲、乙、丙、丁、戊五根繩子分別長(zhǎng)a、b、c、d、e,井深2a+b,5個(gè)未知數(shù)的滿足方程2a+b=3b+c=4c+d=5d+e=6e+a,將1到100分別代入進(jìn)行試算。

      由于運(yùn)行時(shí)間較長(zhǎng),運(yùn)行時(shí)將消耗時(shí)間打印出來(lái)了,此時(shí)顯示的是運(yùn)行了a取值1到10的運(yùn)行時(shí)間222秒(圖2)。

      2.時(shí)間復(fù)雜度

      如果取值范圍在100以內(nèi),則時(shí)間復(fù)雜度是10的10次方,按運(yùn)行時(shí)間算,運(yùn)行了10個(gè)a將近4分鐘,那運(yùn)行100個(gè)a,需要的時(shí)間就大約是40分鐘(圖3)。

      當(dāng)a的取值在300以內(nèi)時(shí),運(yùn)行1個(gè)a需要的時(shí)間將近30分鐘,那300個(gè)a就是近150個(gè)小時(shí),需要6天多的時(shí)間(圖4)。

      這樣長(zhǎng)的運(yùn)行時(shí)間程序完全無(wú)法實(shí)用,必須通過(guò)縮減無(wú)效運(yùn)算來(lái)優(yōu)化程序。改為將最短的繩子e作為枚舉的主要參數(shù),根據(jù)題目分析我們也能提前知道各未知數(shù)的大小關(guān)系,將d的試算起始數(shù)量從1改為從e開(kāi)始,其他幾個(gè)未知數(shù)以此類推。根據(jù)網(wǎng)絡(luò)搜索答案,我已經(jīng)知道e的最小正整數(shù)解小于100,b小于300。新增了變量bj=1用來(lái)判斷,當(dāng)獲得答案后立刻跳出循環(huán)。等待一段時(shí)間能夠獲得答案(圖5)。

      運(yùn)行10個(gè)e的時(shí)間將近是6分鐘,隨e值增大,單次運(yùn)算時(shí)間還會(huì)縮短。優(yōu)化后,運(yùn)行時(shí)間大大縮短了,只需25分鐘左右,已經(jīng)獲得了一組結(jié)果(圖6)。

      我們根據(jù)已有答案回推優(yōu)化程序,最終獲得了結(jié)果。但是如果我們不知道答案的范圍,即使只在300范圍內(nèi)試算,運(yùn)行也要6個(gè)小時(shí)左右。枚舉法在面對(duì)這樣一個(gè)不定方程的情況時(shí),如果不知道結(jié)果的范圍,那么運(yùn)行時(shí)間就會(huì)非常長(zhǎng)!必須去尋找更簡(jiǎn)捷的算法。

      3.方程解法的程序設(shè)計(jì)

      (1)利用sympy庫(kù)函數(shù)先求出不定方程的關(guān)系式(圖7)。

      猜你喜歡
      程序設(shè)計(jì)程序優(yōu)化
      基于OBE的Java程序設(shè)計(jì)個(gè)性化教學(xué)研究
      項(xiàng)目化教學(xué)在Python程序設(shè)計(jì)課程中的應(yīng)用
      C++程序設(shè)計(jì)課程教學(xué)改革研究
      營(yíng)商環(huán)境五方面持續(xù)優(yōu)化
      醫(yī)學(xué)專業(yè)“Python程序設(shè)計(jì)”課程教學(xué)改革總結(jié)與思考
      給Windows添加程序快速切換欄
      優(yōu)化英語(yǔ)課堂教學(xué)策略的探索
      簡(jiǎn)化化學(xué)平衡移動(dòng)教學(xué)程序探索
      促進(jìn)學(xué)生認(rèn)識(shí)發(fā)展 優(yōu)化初中化學(xué)復(fù)習(xí)
      “程序猿”的生活什么樣
      青川县| 余庆县| 呼伦贝尔市| 晴隆县| 旅游| 宜宾县| 石首市| 永胜县| 淮阳县| 清徐县| 临沧市| 东台市| 蓝田县| 海林市| 富民县| 饶平县| 将乐县| 鹤山市| 冀州市| 顺义区| 牡丹江市| 西平县| 涟水县| 蒙山县| 寿宁县| 府谷县| 安宁市| 江西省| 平利县| 翁牛特旗| 黄陵县| 武威市| 信丰县| 保亭| 额敏县| 安吉县| 光山县| 花莲县| 临朐县| 绍兴县| 灵山县|