乙個數的因子個數 (多種時間複雜度)

2021-10-03 03:10:08 字數 1272 閱讀 7848

typedef long long ll;

ll factor(ll n)

}return ans;

}

只需遍歷 1到sqrt(n) 原因是若i為約數,則n / i也為約數計算 40 的因子個數為 8

分別是 1 2 4 5 8 10 20 40

觀察規律 可發現

1 2 4 5 (4

0\sqrt 40

4​0) 8 10 20 40

從4

0\sqrt 40

4​0 分開兩側,

當找到(1 2 4 5 )通過 n/i 則可求出

(40 20 10 8 )

**求出 i 為因子 且 n/i!=i,則 ans+=2;

若 (n

\sqrt n

n​)為 n 的因子,則 ans+=1;(即求出 i 為因子 且 n/i==i)

例如  計算4的因子個數 為 3  即(1,2,4)
typedef

long

long ll;

ll factor

(ll n)

else ans+=2

;// 如果兩因子不相同,則加2}}

由公式 計算

typedef

long

long ll;

ll factor

(ll n)

ans=ans*

(a+1);

}}if(n>1)

// 當 n 為質數時,答案乘2,例如 17 的因子 只有 1和17

ans=ans*2;

return ans;

}

另附計算因子和

ll sum

(ll n)

ans=ans*

(a*i-1)

/(i-1)

;}}if

(n>1)

ans=ans*(1

+n);

return ans;

}

找乙個數的因子個數,因子和

1.所有因子個數 如果乙個數是因數,就不斷除這個數,儲存這個因子次方的數 temp 運用所有因子個數計算公式 見上圖 儲存因子個數的 ans不斷乘 temp 1 注意 當最後,在 x 不斷除因數得到的值有兩種情況 x 1,這說明 x 沒有其他因子了。x 1,這時 x 為其乙個素數因子 且這個因子大於...

判斷乙個數的素因子個數

有感而發 就寫一下 doge 這裡手動 solemntee include using namespace std typedef long long ll intmain ans if n 1 ans 如果是個素數 n就不會被除到1 cout 輸出乙個非素數的所有素因子 個數 include us...

複雜度更低的求乙個數的所有約數

最簡單的想法是對所有小於這個數的數逐個遍歷取餘是否為0。但是這種方法的複雜度是o n 的,如下 n int input list1 for i in range 1 n 1 if n i 0 print list1 做題的時候往往這樣複雜度過高,我們將遍歷變成 1,n 0.5 求前一半的約數,求出來...