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

#include <stdio.h> int main() { int x, y, digit1, digit2, num; scanf("%d %d", &x, &y); if (x >= y) { num = y; } else { num = x; } while (x >= 1 && y >= 1) { digit1 = x % num; digit2 = y % num; if (digit1 == 0 && digit2 == 0) { printf("%d", num); return 0; } num-- } return 0; }
这段代码试图计算两个整数的最大公约数(GCD),但逻辑有误。它从较小的数开始向下检查,看是否能同时整除两个数,但循环条件 `x >= 1 && y >= 1` 和取模操作 `x % num` 的使用方式不正确。

- 循环条件 `x >= 1 && y >= 1` 与寻找公约数无关,应该检查 `num` 是否大于0,因为 `num` 才是你递减的变量。
- 取模运算应该用 `x % num` 和 `y % num` 来检查 `num` 是否能整除 `x` 和 `y`,但这里 `num` 初始值是较小的数,而 `x` 和 `y` 在循环中从未改变,所以第一次取模结果可能不是0,但 `num` 递减后,后续检查的是同一个 `x` 和 `y` 对新的 `num` 的取模,这个思路本身是对的,但循环条件错误导致可能提前退出。