質因子分解

2021-07-04 16:47:45 字數 1417 閱讀 7556

今天沒事做,我們來寫個部落格,混混等級!

我們以求數的質因子的個數為例來講解。

對於質因子分解最簡單最純粹的暴力我相信大家都會的。

int getnum(int x)

}return ans;

}

但是當處理的資料比較多,而且範圍也比較大的時候顯然這種方式就不再那麼適合了。

既然我們是分解質因子,那麼我們就可以先預處理出在範圍內的所有素數,我們篩的時候用素數來篩選!

#define nn 1000010

bool vis[nn];

int k,p[nn],f[nn];

void init()

{ memset(vis,false,sizeof(vis));

vis[1]=true;

for(int i=2;i*2<=nn;i++)

if(!vis[i])

for(int j=i*i;j<=nn;j+=i)

vis[j]=true;

k=0;

for(int i=2;i當然也可以用這種方式來預處理x小於nn的所有數的質因子個數。

#define nn 1000010

bool vis[nn];

int k,p[nn],f[nn];

void init()

{ memset(vis,false,sizeof(vis));

vis[1]=true;

for(int i=2;i*2<=nn;i++)

if(!vis[i])

for(int j=i*i;j<=nn;j+=i)

vis[j]=true;

k=0;

for(int i=2;i用這種方式來預處理小於nn的所有數的質因子個數的方式,我在本地跑用了大概0.125s。

上面的方式不僅可以求個數,也可以求出他的質因子是那些數。

下面我們來介紹一種很快算出質因子個數的姿勢,但是只能算出個數而已,並不能算出是他的質因子是那些數。

它的思想基於素篩,複雜度和素篩的差不多。

#define nn 1000010

int f[nn];

void init()

{ memset(f,0,sizeof(f));

for(int i=2;i

就是這麼簡單,是不是沒想到呀。當然這種思想還可以求出它不同質因子的個數。處理方式相近,只是多了個if....else..而已

#define nn 1000010

int f[nn];

void init()

{ memset(f,0,sizeof(f));

for(int i=2;i

如果有什麼錯誤,還麻煩告訴我一下,我也好修改。



質分解因數 質因子分解

3 參考 分解因數 時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 題目描述 所謂因子分解,就是把給定的正整數a,分解成若干個素數的乘積,即 a a1 a2 a3 an,並且 1 a1 a2 a3 an。其中a1 a2 an均為...

質因子分解

這個東西會在程式執行結尾提示 press any key to continue 用以結束程式。貴在那裡?讓我們來看看system pause 的流程 1 暫停你的程式 2 在sub process中啟動os 3 尋找要執行的命令並為之分配記憶體 4 等待輸入 5 記憶體 6 結束os 7 繼續你的...

分解質因子

in mathematics,the function d n denotes the number of divisors of positive integer n.for example,d 12 6 because 1,2,3,4,6,12 are all 12 s divisors.in ...