質因子分解

質因子分解的問題就是給定一個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;
    }
相關文章
相關標籤/搜索