在线编译器 C

#include <stdio.h> int main() { int n, a, min = 10, max = 0, s_n; // scanf("%d", &n); n = 1235; s_n = n; while (n != 0) { a = n % 10; if (a > max) max = a; n = n / 10; } n = s_n; while (n != 0) { a = n % 10; if (min > a) min = a; n = n / 10; } printf("%d %d", min, max); return 0; }
这段代码的功能是:给定一个整数(这里固定为1235),分别找出它的各位数字中的最小值和最大值,并输出。

代码先找出最大值,再找出最小值。但这里有一个逻辑上的小问题需要注意。

- 在找最小值时,`min` 的初始值是10,这本身没问题,因为数字0-9都比10小。但要注意,如果数字中包含0,`min` 会被正确更新为0。
- 关键问题在于:代码中找最大值和找最小值是分开的两个循环,但第一个循环结束后 `n` 已经变为0,所以第二个循环开始前用 `s_n` 恢复了 `n` 的原始值。这个做法是正确的。

不过,有一个更隐蔽的问题:如果输入的数字是负数,这段代码会怎样?你可以思考一下。

- 提示1:检查当输入的数字为0时,程序会输出什么?目前代码中 `n=1235` 是固定的,但如果你改成 `n=0`,两个循环都不会执行,`min` 和 `max` 会保持初始值10和0,这不符合预期。想想如何正确处理数字0的情况。
- 提示2:代码中 `min` 初始化为10,`max` 初始化为0。如果数字中所有位都大于0,比如1235,`max` 能正确找到5,但 `min` 初始值10比任何一位都大,所以也能正确找到1。但如果数字中包含0,比如1023,`min` 会正确变成0。但如果数字中所有位都大于等于10?这不可能,因为每位数字只能是0-9。所以初始值选择是合理的,但唯一的问题是数字0本身。