先看一道小學國際數學奧林匹克難度計算題 有兩類三位數,其中A類滿足各個數字上的數的和是19,B類滿足各個數字上的數的和為8,請問A類數更多還是B類數更多?多出幾個? 一般數學解法 大部分學生首先想到的是列舉法,分析滿足A條件(100A + 10B + C = 19)和B條件(100A + 10B + C =8)的所有數的列表(如下圖),這是一項比較費時費力的方法,而且可能因為馬虎會少列幾個數字而導致答案錯誤。
改良數學解法我們仔細觀察, A的三位數數位之和是19 , B的三位數數位之和是8 ,兩者加起來19+8 = 27 ,正好是9 + 9 + 9 ,這就代表和為8的三位數(ABC)都正好有一個和為19的數對應(9-A 9-B 9-C) 。
另外,我們從三個位數和為19的數比較三個數位和為8的數,發現和為19的三位數多了首位是9的數,這正好是9個,(當A=0時三位數退化成兩位數不符合條件),因此得出A類數更多, A類數比B類數多出9個。
一般程序解題 在了解解題方法後,我們用Python程序來解答這道題。把題目條件的邏輯寫清楚,程序上用到了CodeCombat電腦科學4的主要知識點如For循環、遍歷、列表、算數運算等知識點, 16行程式碼(如下圖)寫好後,運行馬上得出符合A類條件的數是45個, B類條件的數是36個。
改良算法解題
我們還可以把題目的邏輯進一步優化,把16行程式碼簡化成1行程式碼,輸入程序,馬上得出正確答案為9.
print (sum ([1 if s==19 else (-1 if s==8 else0) for s in [x//100 + x//10%10 + x%10 for x in range (100,1000)]]))針對這道數學題,程序的解法更通用,因為程序可以處理任何三位數的和問題。而精巧的數學解法發現了這道題條件的特殊性,給出了本題的更簡潔的解法。 數學方法是根基,電腦的強項是強大的計算能力,數學思維結合電腦的強大計算能力,往往事半功倍,這也是我們鼓勵同學們學習程式,讓思考問題和解決問題多了一個維度,追求解法的優化和改進。
想了解更多?點擊按體驗免費程式課程!
更多相關文章
- 火爆全球的青少年程式編寫史詩大片《Ozaria傳奇》
- 新冠肺炎帶給全球青少年程式教育的挑戰和機會
- CodeCombat 創始人Nick Winter:如何幫助中小學程式教育展開和深耕
- CodeCombat入選第33屆國際資訊奧林匹亞競賽IOI專項賽
- 兒童程式設計課程推薦!國小小學生線上也能輕鬆學習!
- 新加坡如何用CodeCombat開展全國青少年Python編程競賽
- CodeCombat多人競技場關卡的教師指南
- 想跟上科技趨勢,就該從小培養孩子程式技能嗎?
- Ozaria 2020 程式編寫一小時 榮登全球最受歡迎活動
- 國小、國中、高中生適合學習什麼程式語言?兒童程式課程推薦
- 採用CodeCombat的學校遍及全球 亞太地區尤甚
- 適合國小、國中生的在家程式自學懶人包:兒童學習程式資源、入門營隊課程推薦
- 新加坡運用CodeCombat建立青少年程式學習社群與競賽活動