【Python實作】用Python求阿姆斯壯數Armstrong Numbers有哪些?

這篇用 Python 實作找出指定範圍內的阿姆斯壯數,也就是 Armstrong Numbers。練習重點包含字串轉換、函數、if/else、邏輯運算子,以及 for 迴圈。

📘 Python 實作|求阿姆斯壯數 Armstrong Numbers

練習目的

這次的練習目標,是透過阿姆斯壯數的判斷題目,熟悉 Python 中數字、字串與函數的搭配使用。

  • 練習將整數轉成字串。
  • 練習使用 len() 取得位數。
  • 練習使用 sum() 加總運算結果。
  • 練習自訂函數 def
  • 練習 if/else 與邏輯運算子 not
  • 練習用 for 迴圈逐一檢查範圍內的數字。

🔢 什麼是阿姆斯壯數?

所謂阿姆斯壯數,指的是一個 n 位數的整數,它的所有位數各自取 n 次方後,總和剛好等於自己。

舉例來說,1634 是一個 4 位數,它包含的個別數字是: 1634

1634 = 1^4 + 6^4 + 3^4 + 4^4

因為這四個數字的 4 次方總和剛好是 1634,所以 1634 是 Armstrong Number。

再看另一個常見例子:153

153 = 1^3 + 5^3 + 3^3

153 是 3 位數,而各位數的 3 次方總和剛好等於自己,所以 153 也是 Armstrong Number。

🧭 題目說明

讓使用者輸入兩個數字 nm,找出 nm 範圍內的所有 Armstrong Numbers。

題目條件:
0 < n < m < 1000000

🧪 完整程式碼

以下是完整的 Python 阿姆斯壯數判斷程式。

# 程式開始 def is_armstrong(num): # 把數字轉字串,方便取每個位數 digits = str(num) # 取得數字的位數 n = len(digits) # 計算每個位數的 n 次方總和 total = sum(int(d) ** n for d in digits) # 判斷總和是否等於原本的數字 return total == num # 讀取輸入 n = int(input("請輸入起始值 n: ")) m = int(input("請輸入結束值 m: ")) # 確保條件 0 < n < m < 1000000 if not (0 < n < m < 1000000): print("輸入範圍錯誤,請確認 0 < n < m < 1000000") else: print(f"{n} 到 {m} 之間的 Armstrong numbers:") for i in range(n, m + 1): if is_armstrong(i): print(i) # 程式結束

🖥️ 程式輸出結果

假設輸入的起始值是 10,結束值是 10000

請輸入起始值 n: 10
請輸入結束值 m: 10000
10 到 10000 之間的 Armstrong numbers:
153
370
371
407
1634
8208
9474

🔎 程式說明

這支程式可以分成兩個部分:第一部分是判斷單一數字是否為阿姆斯壯數的函數,第二部分是主程式,用來讀取範圍並逐一檢查。

1. 建立 is_armstrong() 函數

def is_armstrong(num):

這裡定義了一個函數 is_armstrong(),用來判斷傳入的數字 num 是否為阿姆斯壯數。

函數的好處是可以把「判斷阿姆斯壯數」這件事包起來,之後只要呼叫函數,就可以重複使用這段邏輯。

2. 將數字轉成字串

digits = str(num)

這一行會把數字轉成字串。

例如:

num = 153 digits = "153"

轉成字串後,就可以逐一取出每個位數,例如 "1""5""3"

這是一個很常見的技巧:
如果想逐一處理數字的每個位數,可以先用 str() 把數字轉成字串。

3. 使用 len() 取得位數

n = len(digits)

len() 可以取得字串長度。

因為 digits 是由數字轉成的字串,所以它的字串長度就是這個數字的位數。

digits = "153" len(digits) = 3 digits = "1634" len(digits) = 4

這個位數 n 會用來當作每個數字要取幾次方的依據。

4. 計算每個位數的 n 次方總和

total = sum(int(d) ** n for d in digits)

這一行是整個判斷邏輯的核心。

它會把 digits 裡面的每個字元取出來,轉成整數後,再計算 n 次方,最後用 sum() 加總。

153 為例:

digits = "153" n = 3 int("1") ** 3 = 1 int("5") ** 3 = 125 int("3") ** 3 = 27 total = 1 + 125 + 27 = 153

因為計算結果剛好等於原本的數字,所以 153 是阿姆斯壯數。

5. 回傳布林值 True 或 False

return total == num

這一行會判斷 total 是否等於原本的 num

  • 如果 total == num 成立,就會回傳 True
  • 如果 total == num 不成立,就會回傳 False
Python 的布林值要寫成 TrueFalse,第一個字母要大寫。
寫成 truefalse 會出錯。

6. 讀取使用者輸入的範圍

n = int(input("請輸入起始值 n: ")) m = int(input("請輸入結束值 m: "))

主程式會讓使用者輸入兩個整數:

  • n:起始值。
  • m:結束值。

因為 input() 讀進來的資料預設是字串,所以要用 int() 轉成整數。

7. 檢查輸入範圍是否符合題目條件

if not (0 < n < m < 1000000): print("輸入範圍錯誤,請確認 0 < n < m < 1000000")

題目要求輸入範圍必須符合:

0 < n < m < 1000000

所以這裡使用 if not 來判斷「如果不符合條件」,就印出錯誤訊息。

not 是邏輯運算子,意思是「不是」。
所以 if not 條件 可以理解成「如果條件不成立」。

8. 用 for 迴圈逐一檢查 n 到 m 的數字

for i in range(n, m + 1): if is_armstrong(i): print(i)

這裡使用 for 迴圈,從 n 一路檢查到 m

因為 Python 的 range() 會包含起始值,但不包含結束值,所以如果要檢查到 m 本身,就要寫成:

range(n, m + 1)

在每一次迴圈中,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 次方和」可能會覺得有點數學感,但轉成程式後,其實邏輯很清楚。

數字 → 轉成字串 → 逐一取出位數 → 轉回整數 → 計算次方 → 加總 → 比對原數字

只要掌握這個流程,就能理解這支程式的主要邏輯。

留言

這個網誌中的熱門文章

麻將新手必看!不知道聽什麼牌怎麼辦?超多種實戰聽牌範例,教你怎麼判斷胡牌機會

麻將教學懶人包|從規則到牌理的完整觀念整理(附實戰心得)

【新訓入伍】義務役新兵必看!入伍報到必備清單整理|2026年更新