1 条题解

  • 0
    @ 2026-10-26 10:01:48

    思路与算法

    先输出原数和等号。按d从2递增试除当前余数,只要能整除就输出一次d并除掉它,直到不能再整除。d*d大于余数时停止,若余数大于1则输出该余数。因子间打印星号,不合并幂次。

    正确性说明

    处理d前比d更小的质因子已完全除尽。若d能整除余数,d不可能是合数,否则其更小质因子也会整除余数,矛盾,所以输出d为质数。每次除法保持原数等于已输出因子之积乘余数。停止后余数若大于1则必为质数,否则仍有不超过其平方根的因子应继续处理。递增试除并重复输出得到排序后的完整乘积。

    复杂度

    最多试除O(sqrt(N))个候选,成功除法共O(log N)次,总时间O(sqrt(N)+log N),额外空间O(1),初始化O(1)。N为2至20000。

    易错点

    明确范围包含质数,质数应输出N=N。保存原数后才修改余数。重复因子完整输出,不能合并成指数。最后大质因子不能漏掉。等号和星号周围不额外加空格。

    参考代码(C++11)

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        cout << n << '=';
        bool first = true;
        for (int d = 2; d * d <= n; ++d)
            while (n % d == 0) {
                if (!first)
                    cout << '*';
                cout << d;
                first = false;
                n /= d;
            }
        if (n > 1) {
            if (!first)
                cout << '*';
            cout << n;
        }
        cout << '\n';
    }
    
    • 1

    信息

    ID
    1696
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者