質因數分解

2021-10-20 17:46:53 字數 2242 閱讀 1740

在「質數的篩選」中提到過算術基本定理,即任意乙個大於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

n​n

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...