[導讀]:超平老師的Scratch藍橋杯真題解讀系列在推出之后,受到了廣大老師和家長的好評,非常感謝各位的認可和厚愛。作為回饋,超平老師計劃推出《Python藍橋杯真題解析100講》,這是解讀系列的第72講。
各位數字和,本題是2021年11月27日舉辦的第13屆藍橋杯青少組Python編程選拔賽真題編程部分第3題。題目要求編程計算在給定的N個正整數中,哪些正整數各個位數上的數字和為10。
先來看看題目的要求吧。
一.題目說明
編程實現:
給定N個正整數,判斷N個正整數中,哪些正整數各個位數上的數字和為10,并輸出這些正整數,若沒有正整數滿足條件,則輸出0。
例如:輸入4個正整數:19,20,21,28,其中19和28的個位和十位上的數字相加和為10,輸出19,28。
輸入描述:
輸入N個正整數,正整數之間用一個英文逗號隔開
輸出描述:
輸出N個正整數中各個位數上的數字和為10的正整數,正整數之間用一個英文逗號隔開,若沒有正整數滿足條件,則輸出0
樣例輸入:
19,20,21,28
樣例輸出:
19,28
二.思路分析
這是一道簡單的算法題,涉及的知識點包括循環、列表、自定義函數、字符串處理和枚舉算法等。
要找到滿足各位數字和為10的正整數,這是典型的枚舉算法,這里的重點是如何計算給定正整數的各位數字和。
一般來說,有如下兩種方法:
-
字符串方法
-
拆位算法
字符串方法比較簡單,直接遍歷字符串,獲取每一位字符數字,將其轉成數字進行累加即可。
拆位算法則是典型的數學方法,利用余數和整除運算,每一次通過%10運算,獲取最低位,然后使用 /=10運算,去掉最低位,直到數字變為0,這就是經典的拆位算法。
為了簡化代碼結構,我們可以自定義函數來計算給定正整數的和。
思路有了,接下來,我們就進入具體的編程實現環節。
三.編程實現
根據上面的思路分析,我們使用兩種方法來編寫程序:
-
字符串方法
-
拆位算法
1. 字符串方法
根據前面的思路分析,編寫代碼如下:
代碼不少,說明4點:
1). 函數的參數是字符串,返回值是整數;
2). 使用for...in獲取每一個字符,然后通過int()函數轉成數字進行累加;
3). 在獲取輸入的數字時,直接以字符串的形式來保存;
4). 為了方便輸出,這里使用res列表保存滿足條件的數字,最后使用字符串join()方法將數字用逗號連接起來。?
2. 拆位算法
使用拆位算法,編寫代碼如下:
簡單說明3點:
1). 函數的參數是整數,返回值也是整數;
2). 在去掉最低位的時候,使用的是整除運算符//,不能使用/;
3). 由于數字是以字符串的形式保存到nums列表中,在調用函數fsum()的時候,需要使用int()函數將其轉成整數。
至此,整個程序就全部完成了,你可以輸入不同的數據來測試效果啦。
四.總結與思考
本題代碼在14行左右,涉及到的知識點包括:
-
循環語句;
-
列表操作;
-
字符串操作;
-
類型轉換;
-
拆位算法;
本題代碼不多,難度一般,關鍵點有兩個,一是如何獲取給定數字的各位數字,二是使用自定義函數來簡化代碼結構。
獲取數字的每一位數字,這里給出了兩種不同的解決方案,其中字符串方法是Python獨有的特性,方便好用,體現了Python的簡潔性。
相對來說,拆位算法則更加通用,適用于所有的編程語言,也是每個人都必須要掌握的基礎算法。
你還有什么好的想法和創意嗎,也非常歡迎和超平老師分享探討。
如果你覺得文章對你有幫助,別忘了點贊和轉發,予人玫瑰,手有余香😄
需要源碼的,可以移步至“超平的編程課”gzh。