質因子分解

2021-09-24 18:57:06 字數 1722 閱讀 9056

| 儲存結構

定義結構體factor存放質因子及其個數

//質因數 結構體

struct factor fac[10]; //int範圍內,10位夠用了12

345考慮到 2x3x5x7x11x13x17x19x23x29 就已經超過了int範圍,因此對乙個int範圍內的數來說,fac陣列的大小只需開到10就可以了!

| 結論:

對於乙個正整數 n,如果它存在 [2,n] 的質因子,則要麼這些質因子全部小於等於 sqrt(n),要麼只存在乙個大於sqrt(n)的質因子,其餘質因子全部小於等於sqrt(n);

| 求解思路:獲取質因數

0、令 remain = n;

1、列舉 1 ~ sqrt(n) 範圍內所有質因子 p,判斷 p 是否是n的質因子:

是:迴圈相除並記錄 ;

否:跳過;

2、如果以上步驟結束,仍然有 remain > 1,則說明 n 有且僅有乙個大於 sqrt(n) 的質因子,

加入這個質因子即可!(就是當前剩下的部分remain)

| 擴充套件點:

如果要求乙個正整數n的因子個數(注:因子),只需對其質因子分解,得到個質因子的pi的個數分別為e1、e2、… ek,於是n的因子個數就是(e1+1) * (e2+1) * … * (ek+1) ;

【原因:每個質因子pi都可以選擇出現0次、1次、…、ei次,共ei+1種可能,組合起來即為上述答案】

同理,所有因子之和為:(1+p1+p12+…+p1e1) * (1+p2+p22+…+p2e2)* … *(1+pk+pk2+…+pkek) ;

| 具體實現:

const

int maxn =

100010

;//int範圍內,素數錶開到10^5就夠用了!

int prime[maxn]

, pnum =0;

//素數表, 素數個數

//質因子 結構體

struct factor fac[10]

;//int範圍內,10位夠用了

//判斷素數

bool isprime

(int k)

return true;

}//儲存素數表

void

get_prime

(int n)

}//儲存質因子資訊

intget_factor

(int n)

count++

;//不同質因子個數+1

if(remain ==1)

break

;//及時退出迴圈,節省時間}if

(remain >1)

return count;

}/*質因子分解給定整數,並輸出*/

intmain()

if(fac[fac_num-1]

.num !=1)

printf

("%d^%d\n"

, fac[fac_num-1]

.x, fac[fac_num-1]

.num)

;else

printf

("%d\n"

, fac[fac_num-1]

.x);

return0;

}------

----

----

----

---

原文:https:

82192117

質分解因數 質因子分解

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 繼續你的...