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

#include <math.h> #include <stdio.h> int main() { int n, i = 1; int m, p; scanf("%d", &n); m = sqrt(n); while (i <= m) { if (n % i == 0) { printf("%d ", i); } i++; } printf("%d",i); while (i >= 0) { p = n / i; printf("%d ", p); i--; } return 0; }
这段代码试图输出一个整数 n 的所有因数,但存在逻辑错误。它先从小到大输出小于等于 sqrt(n) 的因数,然后从大到小输出对应的另一半因数,但循环条件和变量使用有问题。

- 第一个 while 循环结束后,i 的值已经变成了 m+1,而不是你期望的 m。第二个 while 循环从 i 开始递减,但此时 i 已经超过了 m,导致第一次计算 p = n / i 时得到的结果不是正确的因数对。
- 第二个 while 循环的条件是 i >= 0,但 i 递减到 0 时,n / 0 会导致除零错误,程序会崩溃。你应该只处理 i 从 m 递减到 1 的情况。