在「質數的篩選」中提到過算術基本定理,即任意乙個大於1
11的正整數都能唯一分解為有限個質數的乘積
所以可以使用試除法o(n
)o(\sqrt n)
o(n
)來實現質因數分解
操作很簡單,從最小的質數2
22開始,一直到n
\sqrt n
n,只要可以整除當前的數,就一直除以這個數,直到不能整除。
for example:
初始的n
nn為120
12012
0,i從2
22迴圈到n
\sqrt n
nn
nn可以整除2
22,此時n=60
n=60
n=60
n
nn可以整除2
22,此時n=30
n=30
n=30
n
nn可以整除2
22,此時n=15
n=15
n=15
n
nn不能整除2
22,i++
i++i++nn
n可以整除3
33,此時n=5
n=5n=5nn
n不能整除3
33,i++
i++i++nn
n不能整除4
44,i++
i++i++nn
n可以整除5
55,此時n=1
n=1n=1n=
1n=1
n=1,結束迴圈
觀察我們除以過的數字,分別是2,2
,2,3
,5
2,2,2,3,5
2,2,2,
3,5所以120=2
×2×2
×3×5
120=2\times2\times2\times3\times5
120=2×
2×2×
3×5
來解釋一下這個思路裡的一些細節問題
1.迴圈到n
\sqrt n
n的原因,還是像0x31 t1中提到的,如果n
nn不為質數,那n
nn就會有除了自己和1
11以外的因數,假設這個因數為i
ii, 那麼n/i
n/in/
i也一定是n
nn的因數,i
ii和n/i
n/in/
i之間一定就會有乙個數≤
n\leq \sqrt n
≤n,所以只需要掃瞄到n
\sqrt n
n,就可以找到除了1
11和n
nn以外是否有其他的因數,即n
nn是否為質數,滿足我們尋找n的質因子的目的。
2.對於每乙個 i
ii 都進行整除的操作,是否會有為合數的i被統計為質因數?答案是不會的,上面的例子中,120
12012
0可以整除4
44,但當i=4
i=4i=
4時,n
nn就已經變為了5
55,已經不能整除4
44了,出現這種情況的原因是,4
44作為乙個合數,也可以進行質因數分解,例如把4
44分解為2×2
2\times 2
2×2,所以n/4
n/4n/
4就等價於n/2
/2
n/2/2
n/2/
2,當i=2
i=2i=
2時,我們就已經把所有的質因子2
22都提出來了,因此當 i
ii 為合數時,n
nn一定不會整除 i
ii3.n
nn的值是否可以一直改變?是的,因為我們要找的始終是現在的n
nn的質因子,所以sqr
t(n)
sqrt(n)
sqrt(n
)也在一直改變。
code
int p[maxn]
,c[maxn]
;//p為底數,c為指數
void
zhiyinshufenjie
(int n)}if
(n>1)
//n現在自身為質數
for(
int i=
1;i<=m;i++
) cout<<<
' '<<}
質因數分解
題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...
質因數分解
短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...
質因數分解
講乙個數分解為幾個質數相乘的結果 int a maxn 用來存質因數 int b maxn 用來存質因數的個數 int main if n 1 不能忘記這一步操作 輸出 第1種寫法 a a a b b b b c c printf 第一種寫法 for int i 1 i tot i else pri...