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

#include <stdio.h> int grow_up(int n) { int a, b, c = 1; if (n < 10) return 0; else { while (n != 0) { a = n % 10; b = (n / 10) % 10; if (a < b) { c = 0; break; } n = n / 10; } if (c == 0) return 0; else return 1; } } int main() { printf("%d", grow_up(0)); return 0; }
这段代码定义了一个函数 `grow_up`,它试图判断一个整数是否满足“从左到右每一位数字都不小于前一位”(即非递减顺序)。例如 123 返回 1,321 返回 0。但代码中存在逻辑问题。

- 函数对个位数(n < 10)直接返回 0,这不符合“非递减”的定义——单个数字应该被认为是满足条件的。
- 在循环中,你比较的是当前位 a 和它的前一位 b,但条件 `a < b` 表示如果当前位小于前一位则标记为失败。然而,对于数字 123,第一次循环 a=3, b=2,3<2 为假,继续;第二次 a=2, b=1,2<1 为假,继续;最后 n=1 退出循环,c 保持为 1,返回 1。这看起来正确,但注意:你的比较方向是“当前位小于前一位”时失败,这实际上检查的是数字是否严格递减?不,它检查的是是否出现下降,但非递减允许相等。你的条件 `a < b` 在相等时不会触发,所以相等的情况会被认为是正确的,这符合非递减。但问题在于个位数的处理。

- 另外,对于像 10 这样的数,第一次循环 a=0, b=1,0<1 为真,c=0,返回 0。但 10 的数字顺序是 1 然后 0,确实是递减,所以返回 0 正确。但个位数如 5,你直接返回 0,这不对。

- 提示:重新考虑个位数的情况。一个数字只有一位时,它是否应该被认为是“非递减”的?通常是的,因为没有相邻对可以比较。

- 提示:检查你的循环逻辑是否覆盖了所有情况。例如,对于 n=0,你的函数会进入 `if (n < 10)` 分支返回 0,但 0 也是单个数字。