1. 程式人生 > 其它 >[AcWing 867] 分解質因數

[AcWing 867] 分解質因數

試除法 複雜度 $ 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. 算術基本定理(唯一分解定理)
    任何一個大於 $ 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\) 是正數;
  2. 演算法思路:列舉 i 從 2 到 $ \sqrt{n} $ ,如果 n % i == 0,就一直用 n 除以 i,求出來 i 的指數,並用 s 來記錄,如果最後 n 大於 1,則此時的 n 是大於 $ \sqrt{n} $ 的那個質因數;
  3. 注意以下幾個問題:
    ① 如果 n % i == 0 的話,可以保證 n 中已經沒有了 2 ~ i - 1 的因子,同樣也保證了 i 中也沒有了 2 ~ i - 1 的因子;(能滿足 n % i == 0 的 i 一定是質數)
    ② n 最多有一個大於 $ \sqrt{n} $ 的因子,因為如果有兩個大於 $ \sqrt{n} $ 的因子,那這兩個因子的乘積會大於 n;