分解質因子問題

2021-07-04 06:52:05 字數 1369 閱讀 7567

題目大意:有t(

1<=

t<=104

)個數arr[1],arr[2]….arr[t],設每個數是n(

2<=

n<=109

),任務是將這個n的質因子分解出來,包括重複的質因子,時限是1000ms。。比如n=18,而18=2*3*3,所以輸出的結果就是2 3 3。

n的範圍是[2

,109]

,很容易想到n的質因子的範圍是[2

,sqr

t(n)

] ,所以可以預處理出[2

,sqr

t(109

)]的所有素數(注:sqrt()就是求解乙個數的平方根),這個範圍內的素數大概只有3千多個,拿這個n跟所有的素數prim[i]從小到大相除,能夠除盡說明這個prim[i]就是其質因子。

當n去除prim[i]時,若能夠除盡,prim[i]就是其質因子,然後n /= prim[i],當n大於1時,繼續除prim[i],直到除不盡prim[i](或者n小於等於1),若n等於1(此時表明n的所有質因子已經分解出),若n還大於1則找下一能被n正除的素數。當n去嘗試完所有的素數後,n還是大於1,此時說明剩下的n是個素數,這個素數是原n的乙個質因子。

#include 

using

namespace

std;

const

int maxn = 40000;//篩4w的素數是遠遠夠的

bool used[maxn];

int prim[maxn];//存放素數

int size = 0;//素數的個數

void is_prim()//埃氏素篩法

for(int i = 2; i < maxn; ++i)

if(!used[i]) prim[size++] = i;

}int main()

}if(n > 1) cout

<< n;//此時說明n是個素數,並且是大於4w的素數

cout

<< endl;

}return0;}

/*input:535

253

77766767

18output:

5 75 5

313 83 72073

2 3 3

*/

時間複雜度的分析,求解出[2

,sqr

t(109

)]的所有素數時間複雜度是個接近線性的時間複雜度o(

sqrt

(109)

) ,求每個數的質因子最壞的情況下會嘗試所有的素數,素數有3k多個,也就是103

,共104

組資料,所以最壞的時間複雜度是$o(10^7),1000ms內還是能夠跑出正確的結果。

質分解因數 質因子分解

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