【Python實作】用Python求阿姆斯壯數Armstrong Numbers有哪些?
📘 Python 實作|求阿姆斯壯數 Armstrong Numbers
練習目的
這次的練習目標,是透過阿姆斯壯數的判斷題目,熟悉 Python 中數字、字串與函數的搭配使用。
- 練習將整數轉成字串。
- 練習使用 len() 取得位數。
- 練習使用 sum() 加總運算結果。
- 練習自訂函數 def。
- 練習 if/else 與邏輯運算子 not。
- 練習用 for 迴圈逐一檢查範圍內的數字。
🔢 什麼是阿姆斯壯數?
所謂阿姆斯壯數,指的是一個 n 位數的整數,它的所有位數各自取 n 次方後,總和剛好等於自己。
舉例來說,1634 是一個 4 位數,它包含的個別數字是: 1、6、3、4。
因為這四個數字的 4 次方總和剛好是 1634,所以 1634 是 Armstrong Number。
再看另一個常見例子:153。
153 是 3 位數,而各位數的 3 次方總和剛好等於自己,所以 153 也是 Armstrong Number。
🧭 題目說明
讓使用者輸入兩個數字 n、m,找出 n 到 m 範圍內的所有 Armstrong Numbers。
0 < n < m < 1000000
🧪 完整程式碼
以下是完整的 Python 阿姆斯壯數判斷程式。
🖥️ 程式輸出結果
假設輸入的起始值是 10,結束值是 10000。
請輸入結束值 m: 10000
10 到 10000 之間的 Armstrong numbers:
153
370
371
407
1634
8208
9474
🔎 程式說明
這支程式可以分成兩個部分:第一部分是判斷單一數字是否為阿姆斯壯數的函數,第二部分是主程式,用來讀取範圍並逐一檢查。
1. 建立 is_armstrong() 函數
這裡定義了一個函數 is_armstrong(),用來判斷傳入的數字 num 是否為阿姆斯壯數。
函數的好處是可以把「判斷阿姆斯壯數」這件事包起來,之後只要呼叫函數,就可以重複使用這段邏輯。
2. 將數字轉成字串
這一行會把數字轉成字串。
例如:
轉成字串後,就可以逐一取出每個位數,例如 "1"、"5"、"3"。
如果想逐一處理數字的每個位數,可以先用 str() 把數字轉成字串。
3. 使用 len() 取得位數
len() 可以取得字串長度。
因為 digits 是由數字轉成的字串,所以它的字串長度就是這個數字的位數。
這個位數 n 會用來當作每個數字要取幾次方的依據。
4. 計算每個位數的 n 次方總和
這一行是整個判斷邏輯的核心。
它會把 digits 裡面的每個字元取出來,轉成整數後,再計算 n 次方,最後用 sum() 加總。
以 153 為例:
因為計算結果剛好等於原本的數字,所以 153 是阿姆斯壯數。
5. 回傳布林值 True 或 False
這一行會判斷 total 是否等於原本的 num。
- 如果 total == num 成立,就會回傳 True。
- 如果 total == num 不成立,就會回傳 False。
寫成 true 或 false 會出錯。
6. 讀取使用者輸入的範圍
主程式會讓使用者輸入兩個整數:
- n:起始值。
- m:結束值。
因為 input() 讀進來的資料預設是字串,所以要用 int() 轉成整數。
7. 檢查輸入範圍是否符合題目條件
題目要求輸入範圍必須符合:
所以這裡使用 if not 來判斷「如果不符合條件」,就印出錯誤訊息。
所以 if not 條件 可以理解成「如果條件不成立」。
8. 用 for 迴圈逐一檢查 n 到 m 的數字
這裡使用 for 迴圈,從 n 一路檢查到 m。
因為 Python 的 range() 會包含起始值,但不包含結束值,所以如果要檢查到 m 本身,就要寫成:
在每一次迴圈中,i 都會被傳進 is_armstrong(i) 函數檢查。
- 如果 is_armstrong(i) 回傳 True,就印出 i。
- 如果回傳 False,就不做任何事,繼續檢查下一個數字。
🧭 執行流程整理
用表格整理整個程式流程,會更容易掌握這題的邏輯。
| 步驟 | 程式做什麼 | 目的 |
|---|---|---|
| 1 | 定義 is_armstrong() | 建立判斷單一數字是否為阿姆斯壯數的函數。 |
| 2 | 使用 str() | 把數字轉成字串,方便逐位處理。 |
| 3 | 使用 len() | 取得數字的位數。 |
| 4 | 使用 sum() | 計算每個位數的 n 次方總和。 |
| 5 | 回傳 total == num | 判斷是否符合阿姆斯壯數條件。 |
| 6 | 讀取使用者輸入 | 取得要搜尋的起始值與結束值。 |
| 7 | 檢查範圍條件 | 確認輸入符合題目要求。 |
| 8 | 使用 for 迴圈 | 逐一檢查範圍內每個數字。 |
💡 小補充:這題練到的 Python 觀念
這題雖然看起來像數學題,但實際上很適合練習 Python 的基本語法。
- 函數:用 def 把判斷邏輯包成 is_armstrong()。
- str():把整數轉成字串,方便逐位處理。
- len():取得數字位數。
- int():把每個字元轉回整數,才能做次方運算。
- sum():加總每個位數的次方結果。
- if/else:判斷輸入範圍是否正確。
- not:判斷條件不成立的情況。
- for 迴圈:逐一檢查範圍內的每個數字。
先把數字轉成字串,逐一取出每個位數,再把每個位數轉回整數計算次方總和,最後判斷總和是否等於原數字。
✅ 小結
阿姆斯壯數的題目很適合拿來練習「數字處理」與「字串處理」之間的轉換。
一開始看到「每個位數的 n 次方和」可能會覺得有點數學感,但轉成程式後,其實邏輯很清楚。
只要掌握這個流程,就能理解這支程式的主要邏輯。
留言
張貼留言