1:所謂的質因子分解是指將乙個正整數n寫成乙個或多個質數的乘積的形式,例如:6=2*3,8=2*2*2.或者將其寫為指數形式,如:6=2^1*3^1,180=
2^2 * 3^2 * 5^1;由於最後要歸結到若干不同指數的乘積,因此需要先將素數表列印出來。
注意:1本身不是素數,因此他沒有質因子,一般就是討論大於1 的數。如果有的題目需要對1進行討論,那麼就要視為特判。
由於每個質因子都可以不只出現一次,因此不妨定義結構體factor,用來存放質因子及其個數。
struct facto***c[10];
這裡的質因子存放到fac陣列裡。如:180來說;
fac[0].x = 2;
fac[0].cnt = 2;
fac[1].x = 3;
fac[1].cnt = 2;
fac[2].x = 5;
fac[2].cnt = 1;
fac[10]開到10的原因是:2*3*5*7*11*13*17*19*23*29就已經超出了int範圍所以就只用到開到10;
對乙個正整數n來說,如果他存在1和本身之外的因子,那麼一定是在sqrt(n)左右成對出現。而這裡也可以用在「質因子」上面,會得到乙個強化結論:對乙個正整數n來說,如果它存在【2,n】範圍的質因子,要麼這些質因子全部小於等於sqrt(n),要麼這些質因子只存在
乙個大於sqrt(n)的質因子,而其餘質因子全部小於等於sqrt(n)。這就有了乙個思路:
1:列舉1~sqrt(n)範圍內的所有質因子p,判斷p是否是n的因子。
如果p是n的因子,那麼給fac陣列中增加質因子p,並初始化為0.然後只要p還是n的因子,就讓n不斷的除以p,每次操作使p的個數加1,直到p不是n的因子為止。
if(n % prime[i] == 0)
num++;
}
如果p不是n的因子,就直接跳過。
2:如果上面的步驟結束後n仍然大於1,說明有且僅有乙個大於sqrt(n)的質因子(有可能是n本身),這時需要把這個質因子加入fac陣列中,並令其個數等於1.
if(n!=1)
至此,fac陣列中存放的就是質因子分解的結果,時間複雜度就是o(sqrt(n))。
質分解因數 質因子分解
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 繼續你的...