1 条题解
-
0
思路
找因数不需要从 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 这一对只算一个,输出时要去重。
- n 可能很大,要用
信息
- ID
- 12
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
吉公网安备22010402001496号