[AcWing 867] 分解質因數
阿新 • • 發佈:2022-05-08
試除法 複雜度 $ O(log(n)) $ ~ $ O(\sqrt{n}) $
點選檢視程式碼
#include<iostream> using namespace std; void divide(int n) { for (int i = 2; i <= n / i; i ++) { if (n % i == 0) { int s = 0; while (n % i == 0) { n /= i; s ++; } printf("%d %d\n", i, s); } } if (n > 1) printf("%d %d\n", n, 1); cout << endl; } int main() { int n; cin >> n; while (n --) { int x; cin >> x; divide(x); } return 0; }
- 算術基本定理(唯一分解定理)
任何一個大於 $ 1 $ 的自然數 $ N $,如果 $ N $ 不為質數,都可以唯一分解成有限個質數的乘積 $ N = P_1^{\alpha_1} * P_2^{\alpha_2} * \cdots * P_n^{\alpha_n} $,這裡 $ P_1 < P_2 < \cdots < P_n $ 均為質數,指數 \(\alpha_i\) 是正數; - 演算法思路:列舉 i 從 2 到 $ \sqrt{n} $ ,如果 n % i == 0,就一直用 n 除以 i,求出來 i 的指數,並用 s 來記錄,如果最後 n 大於 1,則此時的 n 是大於 $ \sqrt{n} $ 的那個質因數;
- 注意以下幾個問題:
① 如果 n % i == 0 的話,可以保證 n 中已經沒有了 2 ~ i - 1 的因子,同樣也保證了 i 中也沒有了 2 ~ i - 1 的因子;(能滿足 n % i == 0 的 i 一定是質數)
② n 最多有一個大於 $ \sqrt{n} $ 的因子,因為如果有兩個大於 $ \sqrt{n} $ 的因子,那這兩個因子的乘積會大於 n;