• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    Python求解“棋盤米粒倍增”問題

    2020-12-15 06:56:50牟曉東
    電腦報 2020年47期
    關(guān)鍵詞:內(nèi)層嵌套米粒

    牟曉東

    印度有個古老傳說:舍罕王打算獎賞國際象棋的發(fā)明人——西薩宰相,在被問及想要得到的賞賜時,西薩回答說:“在棋盤的第1格放1粒大米,第2格放2粒,第3格放4粒,之后的每一格中的米粒數(shù)目都是相鄰前一格的兩倍,一直放到最后的第64格,我只要這一棋盤的大米?!?/p>

    最初國王不以為意,但最終的結(jié)果卻是舉全國之力都無法填滿這個棋盤。果真是這樣嗎?我們使用Python編程來解決這個“棋盤米粒倍增”問題。

    1.常規(guī)的循環(huán)求和法

    首先通過“sum = 0”語句建立并為變量sum賦值為0,準(zhǔn)備存放最終的米粒數(shù)目;接著使用for循環(huán):“for i in range(64):”,其中的range()函數(shù)負(fù)責(zé)提供從0到63共64個循環(huán)計數(shù);由于每格中米粒的數(shù)目可表示為“2的(n-1)次方”,所以循環(huán)體語句為“sum += 2 ** i”,將每次循環(huán)得到的該格子中米粒的數(shù)量與之前所有格子中米粒的數(shù)量和進(jìn)行求和;循環(huán)結(jié)束后通過print語句將求和結(jié)果輸出。

    將程序保存為chessrice1.py,運行后得到結(jié)果(如圖1):

    棋盤米粒的總數(shù)為:184467440737

    09551615 粒。

    2.使用列表推導(dǎo)式計算

    Python的列表推導(dǎo)式在邏輯上等同于循環(huán)語句,優(yōu)點是形式簡潔且速度快,它能夠以非常簡潔的方式對列表(或其他可迭代對象)中的元素進(jìn)行遍歷、過濾或再次計算,從而快速生成滿足特定需求的列表。

    Python的列表推導(dǎo)式可分解為“表達(dá)式+循環(huán)”兩部分,比如通過“sum = sum([2**i for i in range(64)])”這一個語句即可完成所有64格子中米粒的數(shù)量求和,其中的“2**i”即“表達(dá)式”部分,作用是計算每格中的米粒數(shù)量;后面的“for i in range(64)”是“循環(huán)”部分,作用是控制完成從0到63共64次循環(huán);sum變量的賦值,是通過內(nèi)置求和sum()函數(shù)來完成的。

    之前使用常規(guī)循環(huán)求和法得到的結(jié)果是一個20位長的天文數(shù)字,單位是“?!保粔蛑庇^。經(jīng)查詢,1千克大米約有52000粒,通過“mass = int(sum / 52000000)”語句,將這些大米的數(shù)目轉(zhuǎn)換成單位為“噸”并進(jìn)行求整,賦值給mass變量,最后打印輸出。

    將程序保存為chessrice2.py,運行后得到結(jié)果(如圖2):

    棋盤米粒的總數(shù)為:184467440737

    09551615 粒。

    這些米粒的總質(zhì)量為:3547450783

    40 噸。

    米粒總數(shù)的計算結(jié)果與循環(huán)求和法一致,它們的總質(zhì)量是個12位數(shù)字,約是3547.5億噸!中國目前每年產(chǎn)大米約2億噸,所以國王無論如何也拿不出數(shù)量如此龐大的大米,根本就填不滿宰相的棋盤。

    3.兩種方法打印“九九乘法表”

    不管是使用常規(guī)循環(huán)求和還是使用列表推導(dǎo)式,我們都可以正確求解“棋盤米粒倍增”問題,二者在各種問題的求解過程中都比較方便,包括循環(huán)的嵌套,比如打印“九九乘法表”。

    (1)常規(guī)的雙層循環(huán)嵌套

    外層循環(huán)語句為“for i in range(1,10):”,作用是從1到9循環(huán);內(nèi)層循環(huán)語句為“for j in range(1,i+1):”,同樣是使用range()進(jìn)行對應(yīng)次數(shù)的循環(huán);循環(huán)體語句為“print(‘{0}*{1} = {2}.format(j,i,i*j),end=‘ ) ”,這個print語句用到了Python的format()方法進(jìn)行字符串格式化,其中的“{0}”、“{1}”和“{2}”是位置參數(shù),作用是將后面“format(j,i,i*j)”中的三個變量的對應(yīng)數(shù)值進(jìn)行占位輸出;“end=‘ ”的作用是設(shè)置末尾不換行,而不是print的默認(rèn)“換行”值;內(nèi)層循環(huán)結(jié)束后是一個“print()”空語句,作用是換行,即打印完同一個乘數(shù)(比如同是乘以3)的一行循環(huán)后,回車換行。

    將程序保存為ninenine1.py,運行后得到“九九乘法表”(如圖3)。

    (2)列表推導(dǎo)式循環(huán)嵌套

    外層循環(huán)語句仍為“for i in range(1,10):”,內(nèi)層直接就是一個列表推導(dǎo)式(因為本身就是一層循環(huán)):“print(“”.join([“%d*%d=%-2d”%(j,i,j*i) for j in range(1,i+1)]))”。這個print語句中的“join()”方法是將序列中的元素以指定的字符連接生成一個新字符串,依次連接到前面的“”空串后面;其中的“%d”的作用是將數(shù)據(jù)按照整型格式化輸出,“-”表示左對齊,“2”表示數(shù)字不足兩位時進(jìn)行位數(shù)補齊(不足位置用空格)。列表推導(dǎo)式后面的循環(huán)部分是“for j in range(1,i+1)”語句,與常規(guī)雙層循環(huán)嵌套的內(nèi)層循環(huán)語句完全相同。

    將程序保存為ninenine2.py,運行后,同樣也得到了“九九乘法表”(如圖4)。

    猜你喜歡
    內(nèi)層嵌套米粒
    ◆ 裝飾板材
    例析“立幾”與“解幾”的嵌套問題
    ◆ 裝飾板材
    裝飾板材
    ◆ 裝飾板材
    基于嵌套Logit模型的競爭性選址問題研究
    少先隊活動(2020年6期)2020-12-18 01:08:56
    米粒很怕黑
    第十章 米粒的錯誤
    第十章 米粒的錯誤
    尼木县| 汨罗市| 曲阜市| 通海县| 冕宁县| 临桂县| 西安市| 涟水县| 郁南县| 石台县| 化德县| 娄烦县| 建水县| 巴彦淖尔市| 广昌县| 正蓝旗| 景泰县| 广昌县| 台南县| 盐亭县| 大冶市| 吴忠市| 壤塘县| 大冶市| 万荣县| 曲阳县| 鞍山市| 黄山市| 泗洪县| 大城县| 额敏县| 铜川市| 通州区| 德庆县| 阿坝| 普定县| 来凤县| 鄂伦春自治旗| 建昌县| 莒南县| 石嘴山市|