在线编译器 C

#include <stdio.h> int main() { int n, m, i=0,j=0; scanf("%d%d", &n, &m); if (i==m || i==n){ printf("%d", i); 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 从 0 开始,但用 0 做除法取余会导致运行时错误(除零)。同时循环条件 `i!=m || i!=n` 在 i 小于 m 和 n 时永远为真,会导致无限循环。
- 代码中 `if (i==m || i==n)` 的判断没有意义,因为 i 初始为 0,不会等于 m 或 n(除非输入为 0)。

- 提示1:求最大公约数时,i 应该从哪个数开始递增?考虑公约数不可能大于两个数中较小的那个。
- 提示2:循环条件应该让 i 在合理的范围内变化,并且要避免除零错误。思考如何让 i 从 1 开始,并在达到较小数时停止。