常言說得好:“天才在左瘋子在右,而中間的大部分人,都是普通人?!痹谶@個世界上能夠被稱為天才的人,是不多的,愛因斯坦就是其中之一。有個謠傳是說愛因斯坦數學不好,其實這個不好是相對于當時頂尖數學家說的,愛因斯坦只是興趣不在于此。今天就和大家分享一道愛因斯坦提出的一道數學題。
有一條長長的階梯,如果每步跨2臺階,最后剩下1個臺階;如果每步跨3臺階,最后剩下2臺階;如果每步跨5臺階,最后剩下4臺階;如果每步跨6臺階,最后剩下5臺階;如果每步跨7臺階時,最后才正好一臺階都不剩。請問這條階梯共有多少臺階呢?
根據題目的意思我們可以列舉出數學公式:
設:X為總臺階數
X/2=1;X/3=2;X/5=4;X/6=5;X/7=0
分析后你會發現,本題的關鍵就是計算2、3、5、6的最小公倍數30的問題,階梯的階數應該比30的倍數少1,并且還是7的倍數,即30n-1=7m,只需找到合適的n和m即可。
當然以上的分析只是通過數學邏輯的方法解決問題,如果轉換成編程該如何編寫呢?思路的不同,編寫程序的代碼的方式也大不相同,就像莎士比亞所說的,“一千個讀者,就有一千個哈姆雷特”。我用兩種算法來解決這個問題:窮舉法和排除法。


窮舉法我們之前也講過不少的例子,比如雞兔同籠等。設置初始num值為1,通過循環的方式讓num的值不斷累加,每次累加1,并且在循環中根據條件進行判斷,與2的余數是否為1,與3的余數是否為2……一旦有相符合匹配成功的數值就將其添加入列表中。窮舉法有一定的局限性,效率較低,計算量比較大。
除了窮舉法我們還可以使用排除法,在編程前,我們通過簡單的梳理已經了解臺階數是7的倍數,創建一個列表將7的倍數依次添加入此列表中,這里我加入了150個7的倍數。
設定一個因數為2,通過循環每次將因數的值加1,當因數值為4時,強制再加1,修改成5,這樣下一個因數就是6了。通過循環嵌套的方式將列表中每一項的值依次除以因數(2、3、5、6)得出余數,判斷余數是否符合條件,若條件不成立刪除列表中對應的項,程序運行結束后便得到正確的數值。
不同的思路與方法所編程的代碼也是大不相同,我認為學習編程,重要的不是如何寫出華麗的代碼,而是要學會思考,通過模塊化設計做到如何能夠更省力、更快捷地完成程序,提高運行效率。
