常言說得好:“天才在左瘋子在右,而中間的大部分人,都是普通人?!痹谶@個世界上能夠被稱為天才的人,是不多的,愛因斯坦就是其中之一。有個謠傳是說愛因斯坦數(shù)學(xué)不好,其實這個不好是相對于當(dāng)時頂尖數(shù)學(xué)家說的,愛因斯坦只是興趣不在于此。今天就和大家分享一道愛因斯坦提出的一道數(shù)學(xué)題。
有一條長長的階梯,如果每步跨2臺階,最后剩下1個臺階;如果每步跨3臺階,最后剩下2臺階;如果每步跨5臺階,最后剩下4臺階;如果每步跨6臺階,最后剩下5臺階;如果每步跨7臺階時,最后才正好一臺階都不剩。請問這條階梯共有多少臺階呢?
根據(jù)題目的意思我們可以列舉出數(shù)學(xué)公式:
設(shè):X為總臺階數(shù)
X/2=1;X/3=2;X/5=4;X/6=5;X/7=0
分析后你會發(fā)現(xiàn),本題的關(guān)鍵就是計算2、3、5、6的最小公倍數(shù)30的問題,階梯的階數(shù)應(yīng)該比30的倍數(shù)少1,并且還是7的倍數(shù),即30n-1=7m,只需找到合適的n和m即可。
當(dāng)然以上的分析只是通過數(shù)學(xué)邏輯的方法解決問題,如果轉(zhuǎn)換成編程該如何編寫呢?思路的不同,編寫程序的代碼的方式也大不相同,就像莎士比亞所說的,“一千個讀者,就有一千個哈姆雷特”。我用兩種算法來解決這個問題:窮舉法和排除法。
窮舉法我們之前也講過不少的例子,比如雞兔同籠等。設(shè)置初始num值為1,通過循環(huán)的方式讓num的值不斷累加,每次累加1,并且在循環(huán)中根據(jù)條件進行判斷,與2的余數(shù)是否為1,與3的余數(shù)是否為2……一旦有相符合匹配成功的數(shù)值就將其添加入列表中。窮舉法有一定的局限性,效率較低,計算量比較大。
除了窮舉法我們還可以使用排除法,在編程前,我們通過簡單的梳理已經(jīng)了解臺階數(shù)是7的倍數(shù),創(chuàng)建一個列表將7的倍數(shù)依次添加入此列表中,這里我加入了150個7的倍數(shù)。
設(shè)定一個因數(shù)為2,通過循環(huán)每次將因數(shù)的值加1,當(dāng)因數(shù)值為4時,強制再加1,修改成5,這樣下一個因數(shù)就是6了。通過循環(huán)嵌套的方式將列表中每一項的值依次除以因數(shù)(2、3、5、6)得出余數(shù),判斷余數(shù)是否符合條件,若條件不成立刪除列表中對應(yīng)的項,程序運行結(jié)束后便得到正確的數(shù)值。
不同的思路與方法所編程的代碼也是大不相同,我認(rèn)為學(xué)習(xí)編程,重要的不是如何寫出華麗的代碼,而是要學(xué)會思考,通過模塊化設(shè)計做到如何能夠更省力、更快捷地完成程序,提高運行效率。