質因子分解

2021-09-12 17:54:26 字數 1108 閱讀 9508

質因子分解的問題就是給定乙個n使得n能夠分解為多個因子的乘積形式,並且相同因子用指數形式表示;

例如180=2^23^25;

對於這個問題,很好理解,我們的目的就是尋找其因子,通常的方法也就是從0開始列舉,然後通過取模或者整除操作來看是否是我們需要的元素;

具體的思路如下所示:

我們首先建立乙個結構體:

struct facto***c[10];
這裡為每乙個符合條件的因子創立乙個結構體,fac陣列是當前該數字所有因子儲存陣列;

結構體內x代表當前的因子,cnt代表當前因子出現的個數;

這裡開10的目的是如果開更大會導致int溢位,並沒有什麼必要;

接下來就是計算部分;

我們對1~sqrt(n)挨個進行列舉;這裡借鑑了尋找判定素數的概念,因為如果k存在,為n的質因子,對於n/k*n來說,其也是n的質因子,我們的目的是尋找最小質因子,所以只需要列舉到sqrt(n)就可以;

接下來要注意理解乙個質因子分布的問題;

對於我們列舉到sqrt(n),必然會出現兩種情況:

1.所有質因子都在sqrt(n)的列舉範圍內;

2.有乙個質因子大於sqrt(n),但其餘的說有質因子都在sqrt(n)範圍內,並且該較大的質因子必為素數;

我們該怎麼理解這個問題,第一條很好理解,顯然成立,那麼第二條必然成立嗎?

會不會有兩個數字鬥大於sqrt(n),並且這兩個既可能是合數有可能是素數?

首先,不可能有兩個質因子大於sqr(n),這樣會導致乘積大於n,所以不符合初始條件;

那麼剩下的質因子一定為素數嘛?

如果這個質因子是合數,則說明可以分解,必定可以分為多個較小質因子的乘積,或者多個數和乙個素數的乘積;

所以無論那種情況,都是兩種情況中的乙個;

所以接下來我們通過列舉,對乙個質因子猛除,記錄他的出現次數,如果有餘數,進行下乙個數字的列舉猛除;直到到達sqrt(n)邊界,如果還是有餘數,則說明有第二個條件發生,有個較大的質因子,所以直接記錄,因為這個質因子只可能出現一次,如果多次會使得乘積大於n;

大致的判斷邏輯如下所示:

for(int i=0;inum++;}}

if(n!=1)

質分解因數 質因子分解

3 參考 分解因數 時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 題目描述 所謂因子分解,就是把給定的正整數a,分解成若干個素數的乘積,即 a a1 a2 a3 an,並且 1 a1 a2 a3 an。其中a1 a2 an均為...

質因子分解

今天沒事做,我們來寫個部落格,混混等級!我們以求數的質因子的個數為例來講解。對於質因子分解最簡單最純粹的暴力我相信大家都會的。int getnum int x return ans 但是當處理的資料比較多,而且範圍也比較大的時候顯然這種方式就不再那麼適合了。既然我們是分解質因子,那麼我們就可以先預處...

質因子分解

這個東西會在程式執行結尾提示 press any key to continue 用以結束程式。貴在那裡?讓我們來看看system pause 的流程 1 暫停你的程式 2 在sub process中啟動os 3 尋找要執行的命令並為之分配記憶體 4 等待輸入 5 記憶體 6 結束os 7 繼續你的...