Онлайн компилятор C

#include <stdio.h> #include <stdlib.h> // 比较函数:用于 qsort 从小到大排序 int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { int n; // 读取输入,如果读取失败则直接退出 if (scanf("%d", &n) != 1) { return 0; } // 在 int 范围内,一个数的因数个数最多只有 1600 个左右 // 这里开辟 2000 大小的数组绝对安全,可以直接开在栈上,不需要 malloc int divisors[2000]; int count = 0; // 遍历到根号 n for (int i = 1; i * i <= n; i++) { if (n % i == 0) { divisors[count++] = i; // 记录较小的因数 if (i * i != n) { divisors[count++] = n / i; // 记录成对的较大因数 } } } // 排序 qsort(divisors, count, sizeof(int), compare); // 格式化输出:因数之间用空格隔开 for (int i = 0; i < count; i++) { printf("%d", divisors[i]); if (i < count - 1) { printf(" "); } } printf("\n"); return 0; }
这段代码的功能是:读取一个整数 n,找出它的所有因数,并按从小到大的顺序输出,因数之间用空格分隔。

代码的思路是:从 1 遍历到根号 n,每当找到一个因数 i 时,就把 i 和 n/i 都记录下来(如果 i 和 n/i 不相等),最后用 qsort 排序并输出。

- 注意数组 divisors 的大小固定为 2000,虽然注释说“绝对安全”,但如果 n 的因数个数超过 2000(比如 n 非常大且有很多小因数),数组会越界。你可以思考一下,什么情况下因数个数会超过 2000?如何避免这个风险?
- 在记录因数时,代码没有检查 count 是否超过数组大小。如果 count 达到 2000 后继续写入,会导致未定义行为。你可以考虑在写入前增加一个判断。