1 条题解

  • 0
    @ 2026-8-18 11:55:38

    思路

    找因数不需要从 1 试到 n,只需要试到 √n:如果 i 是 n 的因数,那么 n / i 也是。每发现一对就收集两个。

    代码

    #include <stdio.h>
    
    int main() {
        long long n;
        scanf("%lld", &n);
    
        long long small[100000], big[100000];
        int cnt = 0;
    
        for (long long i = 1; i * i <= n; i++) {
            if (n % i == 0) {
                small[cnt] = i;         // 小因数
                big[cnt] = n / i;       // 配对的大因数
                cnt++;
            }
        }
    
        // 先输出所有小因数(本来就是升序)
        for (int i = 0; i < cnt; i++)
            printf("%lld ", small[i]);
        // 再倒着输出大因数(从大到小收集,倒过来就是升序)
        for (int i = cnt - 1; i >= 0; i--) {
            if (big[i] != small[i])     // 完全平方数避免重复输出
                printf("%lld%c", big[i], i == 0 ? '\n' : ' ');
        }
        return 0;
    }
    

    易错点

    • n 可能很大,要用 long long,读入用 %lld。
    • 如果 n 是完全平方数(如 36 = 6×6),√n 这一对只算一个,输出时要去重。

    信息

    ID
    12
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者