跳到主要內容

【Python實作】質因數分解

Python 實作|質因數分解

這篇文章要用 Python 來練習一個很經典的數學題目: 質因數分解。從國小短除法,到國中學質數,我們都曾經手算過這類題目。 不過當數字變大時,人類的耐心通常會先分解掉,這時候就交給程式處理吧。

練習重點:數學運算子、迴圈、字典 Dictionary、字串組合

題目說明

讓使用者輸入一個正整數,程式將該數字分解成數個質數的乘積。

例如:

12 = 2^2 * 3

這裡的次方符號使用 ^ 表示。


完整程式碼

以下是完整的 Python 質因數分解程式:

# 質因數分解程式

n = int(input("請輸入一個正整數:"))

num = n          # 保留原本輸入的數字,最後輸出結果時會用到
factor = 2       # 從最小的質數 2 開始嘗試
result = {}      # 用字典儲存質因數與次方數


# 進行質因數分解
while factor * factor <= n:
    while n % factor == 0:
        result[factor] = result.get(factor, 0) + 1
        n //= factor

    factor += 1


# 如果最後剩下的 n 大於 1,表示它本身也是一個質因數
if n > 1:
    result[n] = result.get(n, 0) + 1


# 整理輸出格式
output = []

for p, exp in result.items():
    if exp == 1:
        output.append(f"{p}")
    else:
        output.append(f"{p}^{exp}")


# 印出結果
print(f"{num} = " + " * ".join(output))

執行結果

下面用幾組數字測試看看。

第一次執行

請輸入一個正整數:100
100 = 2^2 * 5^2

第二次執行

請輸入一個正整數:1111
1111 = 11 * 101

第三次執行

請輸入一個正整數:5200
5200 = 2^4 * 5^2 * 13

程式說明

這支程式的核心概念很單純: 從 2 開始嘗試除輸入的數字,只要可以整除,就代表找到一個質因數。 每除一次,就把該質因數的次方數加一。

一、準備變數

n = int(input("請輸入一個正整數:"))

num = n
factor = 2
result = {}
  • n:使用者輸入的數字,之後會不斷被除小。
  • num:保留原始輸入值,最後輸出結果時使用。
  • factor:目前嘗試的因數,從 2 開始。
  • result:用來記錄質因數與次方數。

二、外層迴圈:檢查到平方根即可

while factor * factor <= n:

這裡使用 factor * factor <= n, 意思是只需要檢查到目前數字的平方根為止。

例如要分解 25,只需要檢查到 5 就好。 因為如果一個數字有超過平方根的因數,那麼一定會搭配一個小於平方根的因數,前面早就會被檢查到了。

小提醒:這裡也可以用 math.sqrt(), 但直接使用平方比較簡潔,也可以避免浮點數誤差。

三、內層迴圈:只要可以整除,就一直除

while n % factor == 0:
    result[factor] = result.get(factor, 0) + 1
    n //= factor

如果 n % factor == 0, 代表目前的 factor 可以整除 n, 也就是它是其中一個質因數。

接著這一行會把質因數出現的次數加一:

result[factor] = result.get(factor, 0) + 1

result.get(factor, 0) 的意思是:

  • 如果字典裡已經有這個 factor,就取出它原本的次方數。
  • 如果還沒有,就先當作 0。
  • 最後再加 1,表示這個質因數又出現了一次。

然後使用整數除法:

n //= factor

這行會把 n 除以目前的質因數,並更新成新的值。

四、換下一個因數

factor += 1

當目前的 factor 已經不能再整除 n, 就讓 factor 加一, 繼續檢查下一個可能的因數。


用 12 實際跑一次

假設輸入的數字是 12,程式會這樣運作:

  1. 一開始 n = 12factor = 2
  2. 2 * 2 <= 12,符合外層迴圈條件。
  3. 12 可以被 2 整除,所以記錄一次 2,得到 result = {2: 1}
  4. 將 12 除以 2,得到 n = 6
  5. 6 仍然可以被 2 整除,所以再記錄一次 2,得到 result = {2: 2}
  6. 將 6 除以 2,得到 n = 3
  7. 3 不能被 2 整除,所以 factor 加一,變成 3。
  8. 此時 3 * 3 <= 3 不成立,外層迴圈結束。

迴圈結束後,目前結果是:

result = {2: 2}
n = 3

最後剩下的 n = 3 大於 1,代表它本身也是一個質因數,所以要再放進字典:

if n > 1:
    result[n] = result.get(n, 0) + 1

最後得到:

result = {2: 2, 3: 1}

整理輸出格式

字典裡雖然已經有答案,但直接印出字典不太像數學表示式。 所以最後要把它整理成比較好看的格式。

output = []

for p, exp in result.items():
    if exp == 1:
        output.append(f"{p}")
    else:
        output.append(f"{p}^{exp}")

這段程式會逐一取出字典中的質因數與次方數。

  • 如果次方數是 1,就只顯示質因數本身,例如 3
  • 如果次方數大於 1,就顯示成 2^2 這種格式。

最後用 " * ".join(output) 把每一個質因數用乘號串起來:

print(f"{num} = " + " * ".join(output))

如果 output 裡面是:

["2^2", "3"]

那麼最後就會輸出:

12 = 2^2 * 3

小結

這次的質因數分解練習,主要用到了幾個 Python 基礎觀念:

  • 取餘數運算子:使用 % 判斷是否可以整除。
  • 整數除法:使用 // 更新被分解的數字。
  • while 迴圈:重複檢查每一個可能的因數。
  • 字典 Dictionary:儲存質因數與出現次數。
  • 字串組合:用 join() 組成最後的數學表示式。

這類題目看起來是數學,其實很適合拿來練習程式邏輯。 因為它需要判斷、重複執行、記錄結果,最後再整理輸出。 換句話說,這題雖然叫質因數分解,但它其實也偷偷分解了不少 Python 基礎能力。

留言

這個網誌中的熱門文章

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

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

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