在线编译器 C

#include <stdio.h> int main() { int a; int cnt = 0; scanf("%d", &a); int pre=a%10; a/10; while (a > 0) {int no=a%10; if (no>=pre) { cnt = 1; break; } pre=no; a/=10; } if (cnt == 0) printf("YES"); else printf("NO"); return 0; }
这段代码试图判断一个整数的各位数字是否从左到右严格递减(即前一位数字大于后一位数字)。但代码中存在逻辑错误。

- 代码中 `a/10;` 这一行没有赋值给任何变量,是无效语句,不会改变 `a` 的值。
- 变量 `pre` 初始化为个位数字,但循环从最低位开始比较,这会导致判断方向错误。例如数字 321,个位是1,十位是2,按代码逻辑会认为2>=1,从而输出NO,但实际应该是YES(因为从左到右递减)。
- 循环条件 `while (a > 0)` 在第一次循环后 `a/=10` 会丢失最低位,但 `pre` 初始值已经是最低位,导致比较顺序颠倒。

- 思考一下:要判断从左到右是否递减,应该从最高位开始比较,还是从最低位开始?当前代码是从最低位向高位比较,这和你想要的方向相反。
- 检查 `a/10;` 这一行,它没有效果。你可能是想用 `a = a / 10;` 来去掉个位,但注意初始时 `pre` 已经取了最低位,再去掉个位后,循环里比较的是十位和个位,顺序是反的。