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

#include <stdio.h> int main() { int n, m, i=1,j=0; scanf("%d%d", &n, &m); if (i==m || i==n){ printf("%d", j); return 0; } while (i!=m || i!=n){ if (n%i==0 && m%i==0){ j=i; } i++; } printf("%d", j); return 0; }
这段代码试图计算两个整数 n 和 m 的最大公约数,但逻辑上有错误。

代码从 i=1 开始循环,条件 while (i!=m || i!=n) 会导致循环几乎永远不结束,因为只要 i 不等于 m 或 i 不等于 n 中的一个,循环就会继续。实际上,当 i 超过 m 和 n 中的较大值时,条件仍然为真,循环会一直运行直到 i 溢出。

- 循环条件应该考虑 i 何时停止,而不是比较 i 与 m 和 n 是否相等。通常最大公约数不会超过两个数中较小的那个,所以循环应该到较小的数为止。
- 变量 j 初始为 0,但最大公约数至少是 1,所以如果输入的两个数互质,输出会是 0,这是错误的。应该考虑如何确保 j 能记录到正确的公约数。