淺談關於「百錢買百雞問題」的邏輯思維和Python開發設計

2020-12-25 子甲園

中國古代有個值得研究的問題:一隻公雞值五錢,一隻母雞值三錢,三隻小雞值一錢,現在要用百錢買百雞,請問公雞、母雞、小雞各多少只?這個問題就是著名的「百錢買百雞問題」,出自數學家張丘建的《算經》。

關於這問題我們應該怎樣進行邏輯思維分析,具體步驟如下:

1.列出所有條件:

(1) 雞的類型:公雞(cock)、母雞(hen)、小雞(chicken)

(2) 各種雞的數量:公雞數量=n1、母雞數量=n2、小雞數量=n3

(3) 各種雞的類型的價錢:公雞價錢=5、母雞價錢=3、小雞價錢=1/3

(4) 買雞組合的總價錢:100

(5) 雞的總數量:100

2.列關係式:

(1) 數量關係: n1+n2+n3=100

(2) 價錢關係: 5*cock+3*hen+chicken/3=100

3.確認要求解的數值:n1、n2、n3,為此百錢買百雞問題就轉化成解不定方程組。

Python程序

使用程序進行開發設計,可以使用,以現在流行的Python程序為例,對「百錢買百雞」的課題進行學習討論。對於Python程序的安裝和環境搭建,這裡就不說明,大家可以搜索網絡資料進行學習。

程序代碼如下:

# _*_coding:utf8 _*_cock=[] #公雞列表hen=[] #母雞列表chicken=[] #小雞列表a=5 #公雞價錢b=3 #母雞價錢c=1/3 #小雞價錢n1=int(100/a) #公雞整數數值範圍n2=int(100/b) #母雞整數數值範圍n3=int(100/c) #小雞整數數值範圍for i in range(1,n1+1): #遍歷公雞列表for j in range(1,n2+1): #遍歷母雞列表 for k in range(1,n3+1): #遍歷小雞列表 if i+j+k==100 and i*a+j*b+k*c==100: #根據關係式要求選擇符合要求的數值cock.append(i) #將公雞數值添加到cock=[]列表中hen.append(j) #將母雞數值添加到hen=[]列表中chicken.append(k) #將小雞數值添加到chicken=[]列表中for m in range(int((len(cock)))): #列印所有結果print("結果",m+1,": ","公雞=",cock[m],",母雞=",hen[m],",小雞=",chicken[m])

程序運行結果:

結果 1 : 公雞= 4 ,母雞= 18 ,小雞= 78

結果 2 : 公雞= 8 ,母雞= 11 ,小雞= 81

結果 3 : 公雞= 12 ,母雞= 4 ,小雞= 84

程序分析:

程序使用利用窮舉循環的方法來求解,也就是通過對未知數可變範圍的窮舉,驗證方程在什麼情況下成立,從而得到相應的解。利用三層for循環嵌套:第一層循環控制公雞的數量,第二層控制母雞的數量,最內層控制小雞的數量。窮舉循環的特點就是把所有情況都考慮到,因此每層循環執行一次,對應循環變量的值就要加1。公雞、母雞、小雞數量的確定根據這三層循環我們可以得到很多種方案,在這些方案中有些是不符合n1+n2+n3=100並且5*cock+3*hen+chicken/3=100這兩個條件的,最後把合理的方案篩選出來。對於這種算法,它的整個邏輯思維十分清晰,優點沒有數據遺漏,缺點要耗費較多的運算時間。

優化Python程序

為了進一步優化程序,我們重新對百錢買百雞問題進行再深入的分析,發現有一個隱藏的條件沒有使用,根據要求,買雞組合的總價錢為整數,公雞和母雞單價都為整數,只有小雞單價為小數,為此當買雞組合的總價錢100-公雞總價錢-母雞總價錢的結果必須是整數,又因為三隻小雞為1錢,所以小雞的數量必須是3的倍數,為此我們可以對小雞數量先進行關於3的倍數的篩選,以減少小雞的運算數據,減少運算工作。從而可以對程序進行優化:

代碼優化內容:

for i in range(1,n1+1): #遍歷公雞列表for j in range(1,n2+1): #遍歷母雞列表 if (100-i-j)%3==0: #選取小雞數量值中能整除3的數值(減少數值範圍)n3=100-i-j #對小雞數量進行賦值(3的倍數) if i*a+j*b+n3*c==100: #根據關係式要求選擇符合要求的數值cock.append(i) #將公雞數值添加到cock=[]列表中hen.append(j) #將母雞數值添加到hen=[]列表中chicken.append(n3) #將小雞數值添加到chicken=[]列表中

對於代碼優化後來說,公雞的數量i和母雞的數量j確定後,小雞的數量就固定為100-i-j,無須進行窮舉了,此時約束條件只有一個:5×i+3×j+n3=100;這樣我們利用兩重循環即可實現: 此算法只需嘗試20×33=660次,實現時約束條件中限定了小雞數量必須能被3整除時,只有小雞數量能被3整除時才會繼續進行約束條件「i*a+j*b+n3*c==100; 」的判斷。這樣省去了小雞不能整除3時需要進行的算術計算和條件判斷,將之前的20×33×300=198000次,減少至20×33=660次,大大提高了算法的效率。

相信各位對於關於百錢買百雞問題的邏輯思維有了更清晰的理解,根據此課題進行進一步拓展,可以使用不同的數量,可以嘗試計算千錢買千雞。感謝您讀完了子甲園的分享,歡迎留言一起聊聊天,共同探討各種邏輯思維和Python開發設計。

相關焦點

  • Python開發簡單爬蟲【學習資料總結】
    開發爬蟲步驟 python語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例)
  • 如何在Visual Studio開發工具安裝python庫
    >技術pythonDjango在python語言開發工具的pycharm中,可以安裝第三方庫。那麼,在Visual Studio開發工具中,如何安裝python第三方庫呢?下面利用實例說明:操作步驟:1、打開Visual Studio 2019開發工具,創建python項目
  • 介紹一下什麼是python(瘋狂Python)
    後續我會不斷努力的更新關於學英語的一些文章,同時,我也會不斷更新新的知識(譬如:程式語言:python,資料庫:mysql,Linux系統的一些操作等等,與大家一起學習進步)。進入正題,大家都應該聽說過Python這門程式語言吧,它在程式語言中的排名不斷的再提升,之所以這麼受歡迎,是因為它簡單,易學。
  • 如何在6個月內學會Python?
    筆者學習python用到的一些資源如下所示;1. UdemyComplete Python Bootcamp 和 Python for Data Science課程涵蓋了Python編程的基礎知識和數據科學必不可少的庫。
  • 【乾貨】4月Python 熱門推薦Top 10
    Pipenv是一個Python的打包工具,它解決了使用pip、virtualenv、以及txt的典型工作相關的一些常見問題。 除了解決一些常見問題之外,它還將開發過程簡化為單個命令行工具。數據科學是用各種各樣的工具來解決問題的,而網絡數據採集和正則表達式是我需要做的兩個領域。結果顯示了我們如何將這三種技術結合起來解決數據科學問題。 這個項目的完整代碼可在谷歌實驗室的Jupyter Notebook上找到。
  • Python編程:微信群聊程序的開發與進/線程知識匯總(附代碼)
    本文承接上篇文章的客戶端—伺服器聊天對話程序,進一步設計開發了微信群聊的python模擬程序,涉及的python知識點為:Python實戰:聊天軟體開發與TCP/Socket編程知識匯總(附代碼)和 進程與線程編程!
  • Python真的值得學習嗎
    Python是一門計算機高級程序設計語言。是一種動態的、面向對象的腳本語言。最初是用來編寫自動化腳本,隨著版本的不斷更新和語言新功能的添加,越來越多的時候,被用於獨立或者大型項目的開發。
  • Python和人工智慧有什麼關係?Python 和人工智慧的區別是什麼?
    人工智慧人工智慧是一個大的概念,在人工智慧下有計算機視覺,語音識別,自然語言處理等不同的技術領域,這些技術領域中在Github上又有許多開源的代碼可以直接用來開發,而這些代碼往往需要或者只支持人工智慧是一個大的範疇,包括很多方面的應用,比如機器學習,在機器學習中的回歸算法,它們是通過統計分析所有數據來建立多因式,然後求解式子,而在這個過程中程式語言起到的作用是清洗數據、處理數據、建立關係求解結果的作用,python適用於數據清洗且學習成本低,所以在一定程度上,好一部分人傾向於將python應用於人工智慧應用領域。
  • 深圳羅湖python少兒編程課哪裡學比較好?
    接下來一起來看看深圳羅湖python少兒編程課哪裡學比較好?                                 python少兒編程培訓學校哪家好?ROBOROBO其創意機器人是由首爾大學的工學教授設計,被1200多所中小學以及幼兒園指定為科技器材,每年都有12萬名小朋友同期學習ROBOROBO的機器人編程課程。
  • 3分鐘了解python!新手必看
    一、Python是什麼語言,python是什麼類型的語言?Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum於1989年底發明,第一個公開發行版發行於1991年。
  • 好程式設計師Python培訓分享Python如何調用RPC接口
    Python如何調用RPC接口是很多Python開發工程師比較關心的問題,本篇文章好程式設計師Python培訓小編就給喜歡Python開發的小夥伴們分享一下Python調用RPC接口的詳解,文中有詳細的代碼列出有很好的參考價值,喜歡的小夥伴就隨小編一起來看一下吧,希望對大家有所幫助。
  • Python 開發已成趨勢:幾種主流的Python開發板對比
    默認安裝的Python開發環境已經附帶了很多高級數據類型,如列表、元組、字典、集合、隊列等,無需進一步編程就可以使用這些數據類型的操作。使用這些數據類型使得實現抽象的數學概念非常簡單。 強制縮進,讓代碼自然顯得有條理。 插件齊全,可以完成絕大部分的程序設計任務。
  • 開課吧:Python是什麼意思?為什麼有那麼多人學Python?
    Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷蘭國家數學和計算機科學研究所設計出來的。PythonPython 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。
  • 如何用邏輯思維思考和表達?——讀《邏輯思維簡易入門》
    熱點資訊▕ 知識分享▕ 專業解讀 訂閱NewMediaLab 廣東省新媒體與品牌傳播創新應用重點實驗室 邏輯思維是關於如何思考、如何組織語言和如何表達的思維能力,對於日常生活中解決問題能起到關鍵的作用。
  • 產品設計中,如何體現產品經理的邏輯思維能力?
    確定目標用戶首先,我們要理解這個問題——為人們設計一款新的旅遊產品?這個問題裡包含了兩個關鍵詞——人們和旅遊產品。什麼是人們呢?我要和誰出去旅遊?我要去哪兒旅遊?我要不要做攻略?我要住哪兒?等等這一系列的問題,引出了一個考慮的方向,也就是,關於旅遊,會分為旅遊前的準備過程以及旅遊中的事項。1.
  • 北京朝陽Python少兒編程培訓機構哪家靠譜?
    6 第8單元 人機互動操作 6 更多課程內容及課程價格可諮詢在線客服,我們非常樂意回答您的問題python少兒編程培訓學校哪家好?ROBOROBO其創意機器人是由首爾大學的工學教授設計,被1200多所中小學以及幼兒園指定為科技器材,每年都有12萬名小朋友同期學習ROBOROBO的機器人編程課程。
  • 「Python」每日一練:設計圓類計算周長和面積、設計動物類
    編程題1、設計一個 Circle(圓)類,包括半徑和顏色屬性,編寫構造方法和其他方法,計算圓的周長和面積。請編寫程序驗證類的功能。2、設計一個 Animal(動物)類,包括顏色屬性和叫方法。再設計一個Fish(魚)類息括尾巴和顏色兩個屬性,以及叫方法。要求:Fish類繼承自 Animal類,重寫構造方法和叫方法。編程思路1、Python中類的定義。這裡要思考的是:半徑和顏色應該為類成員還是實例成員呢?因為這兩個屬性非實例成員的共同屬性,因此將半徑和顏色設置為實例成員,直接在構造方法中定義。
  • 初學者應該選擇學習Python開發還是Linux運維
    首先,當前選擇學習Python開發和Linux運維都是不錯的選擇,也都有比較廣闊的上升空間,初學者應該根據自身的知識結構和能力特點進行選擇。Python語言目前的上升趨勢非常明顯,一方面原因是Python語言是當前為數不多的全場景開發語言之一,有大量的應用場景,另一方面原因是Python語言在大數據和人工智慧領域有廣泛的應用,隨著大數據和人工智慧技術的落地應用,Python語言的應用空間將進一步得到拓展。從這個角度來看,學習Python語言是不錯的選擇。
  • 重慶渝北龍湖源著Python少兒編程培訓機構哪家好?
    隨著網際網路和科技的飛速發展,人工智慧時代即將到 來,社會上越來越多的人開始關注人工智慧、關注AI技術,作為人工智慧編程基礎的Python語言,目前也是受到越來越多人的追捧。Python是強制用一 種面向對象的解釋型電腦程式設計語言,代碼優美簡潔,易於理解,並粗功能強大。
  • python爬蟲入門實戰!爬取博客文章標題和連結!
    最近有小夥伴和我留言想學python爬蟲,那麼就搞起來吧。準備階段爬蟲有什麼用呢?舉個最簡單的小例子,你需要《戰狼2》的所有豆瓣影評。最先想的做法可能是打開瀏覽器,進入該網站,找到評論,一個一個複製到文本中,保存,翻頁,接著複製,直到翻到最後一頁。