Online Compiler C

#include <stdio.h> #include <stdlib.h> 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 divisors[2000]; int count = 0; 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 到 sqrt(n) 遍历,如果 i 能整除 n,就把 i 和 n/i 都加入数组(如果 i 和 n/i 相等则只加一次),最后用 qsort 排序后输出。

- 注意数组 divisors 的大小是 2000,如果 n 的约数个数超过这个值,程序会出错。考虑一下 n 最大可能是多少,以及约数个数的上限。
- 在输出循环中,最后一个数字后面不应该有空格,但你的代码已经处理了这一点。不过可以思考一下,如果 count 为 0 时(虽然 n>=1 时不会发生),输出会怎样。