質因子分解的問題就是給定一個n使得n可以分解爲多個因子的乘積形式,而且相同因子用指數形式表示;
例如180=2^23^25;數組
對於這個問題,很好理解,咱們的目的就是尋找其因子,一般的方法也就是從0開始枚舉,而後經過取模或者整除操做來看是不是咱們須要的元素;code
具體的思路以下所示:
咱們首先創建一個結構體:方法
struct factor{ int x; int cnt; }fac[10];
這裏爲每個符合條件的因子創立一個結構體,fac數組是當前該數字全部因子存儲數組;
結構體內x表明當前的因子,cnt表明當前因子出現的個數;
這裏開10的目的是若是開更大會致使int溢出,並無什麼必要;im
接下來就是計算部分;
咱們對1~sqrt(n)挨個進行枚舉;這裏借鑑了尋找斷定素數的概念,由於若是k存在,爲n的質因子,對於n/k*n來講,其也是n的質因子,咱們的目的是尋找最小質因子,因此只須要枚舉到sqrt(n)就能夠;while
接下來要注意理解一個質因子分佈的問題;
對於咱們枚舉到sqrt(n),必然會出現兩種狀況:
1.全部質因子都在sqrt(n)的枚舉範圍內;
2.有一個質因子大於sqrt(n),但其他的說有質因子都在sqrt(n)範圍內,而且該較大的質因子必爲素數;co
咱們該怎麼理解這個問題,第一條很好理解,顯然成立,那麼第二條必然成立嗎?
會不會有兩個數字斗大於sqrt(n),而且這兩個既多是合數有多是素數?數字
首先,不可能有兩個質因子大於sqr(n),這樣會致使乘積大於n,因此不符合初始條件;
那麼剩下的質因子必定爲素數嘛?
若是這個質因子是合數,則說明能夠分解,一定能夠分爲多個較小質因子的乘積,或者多個數和一個素數的乘積;
因此不管那種狀況,都是兩種狀況中的一個;結構體
因此接下來咱們經過枚舉,對一個質因子猛除,記錄他的出現次數,若是有餘數,進行下一個數字的枚舉猛除;直到到達sqrt(n)邊界,若是仍是有餘數,則說明有第二個條件發生,有個較大的質因子,因此直接記錄,由於這個質因子只可能出現一次,若是屢次會使得乘積大於n;枚舉
大體的判斷邏輯以下所示:struct
for(int i=0;i<sqrt(n);i++){ if(n%prime[i]==0){ fac[num].x=prime[i]; fac[num].cnt=0; while(n%prime[i]==0){ fac[num].cnt++; n/=prime[i]; } num++; } } if(n!=1){ fac[num].x=n; fac[num++].cnt=1; }