【Python實作】質因數分解

Python實作_質因數分解

目的:練習數學運算子、集合

說明:國小的時候有學過因數分解,大概是用短除法吧(我忘了?)。後來國中有了質數的觀念,又補強了一次因數分解,題目開始變得要分解很大的數字。但是人類再怎麼分解也有個極限,不過程式可以分解的值就很大了!本篇就來練習用python質因數分解。

題目:讓使用者輸入一個數字,將該數字切分為數個質數的乘積,如 12=2^2 * 3

(次方的符號以 ^ 來表示)

 

 

#程式開始

#質因數分解程式

 

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

num = n                      # 用來之後印結果

factor = 2                   # 從最小質數開始

result = {}                  # 儲存質因數與次方

 

# 質因數分解

while factor * factor <= n:

    while n % factor == 0:

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

        n //= factor

    factor += 1

 

print(result)

# 若最後 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

{2: 2, 5: 2}

100 = 2^2 * 5^2

 

(第二次執行)

請輸入一個正整數:1111

{11: 1}

1111 = 11 * 101

 

(第三次執行)

請輸入一個正整數:5200

{2: 4, 5: 2}

5200 = 2^4 * 5^2 * 13


程式說明

# 質因數分解

 

while factor * factor <= n:(外迴圈):

factor(質因數,起初為2)的次方小於n的時候,質因數分解就做完了,便跳出迴圈。

因為假如我們要分解的數為25,那麼只要檢查它的質因數到525的平方根)即可,因為再往下的話,就會重複。

也可以用math.sqrt()來實現,不過我用平方(比較方便)。

 

 while n % factor == 0: (內迴圈)

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

   n //= factor

 factor += 1

 

n可以整除質因數factor的時候,就把result裡面代表factorkey抓出來,然後針對它的值(Value)做運算。

result.get(factor, 0)result.get是去字典裡面抓factor的值,假如抓不到就建立一個factorkey,然後Value回傳0。最後+1再丟給result[factor]裡面。

n不能整除質因數factor的時候,那麼factor+1,然後再丟回外迴圈檢查。

 

while factor * factor <= n:

    while n % factor == 0:

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

        n //= factor

    factor += 1

12來跑一次這個迴圈試試:

因為2*2=4,而4<=12,符合外外迴圈條件,進到內迴圈

12可以整除2,進到下一步

result.get(2, 0),由於字典裡面沒有2這個key,所以回傳0,然後+1,丟到result[factor],也就是result2:1}。

12/2=6,回到內迴圈

6可以整除2,進到下一步

result.get(2, 0),由於字典裡面有2這個key,回傳它的值(剛剛已經變成1),然後+1,丟到result[factor] ,也就是result2:2

6/2=3,回到內迴圈

3/2不能整除,跳到 factor += 1

factor=3,跳到外迴圈

3*3=99<3,外迴圈結束

 

跑完這個迴圈的結果是:result2:2},且n=3

最後留下來的n假如不是1,那麼必定是質因數,那麼也要把它的1次方丟到字典裡面。在這個例子當中就是3

所以我們要再把3進去:

if n > 1:

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

 

最後字典裡面就是:result2:2,3:1

 

output = []

準備一個容器,裝最後要顯示的字串。

 

for p, exp in result.items():

for迴圈依序把result.items()裡面的元素抓出來

 

 if exp == 1:

    output.append(f"{p}")

假如expresult裡面的value,也就是次方數)是1的話,那就直接顯示p就好,因為1次方沒有意義。3^1就是3,那output裡面填入3就好。

    else:

        output.append(f"{p}^{exp}")

假如exp不是1的話,那output裡面就填入{p}^{exp}

 

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

 

" * ".join(output)的意思是:用 " * " output 裡的每個字串串起來。

經過剛剛的填入,output裡面現在是["2^2", "3"],用字串"*"把他們接起來就是2^2 * 3


留言

這個網誌中的熱門文章

常見的化痰粉愛克痰(小鳥粉)怎麼吃?|化痰粉成人及小孩的使用劑量|紅色與藍色比較

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

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