| 儲存結構
定義結構體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 繼續你的...