題目大意:有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 繼續你的...