Online Compiler C

#include <stdio.h> int main() { int N,max,min,A,B,ori; scanf("%d",&N); ori = N; max=N%10; while(N>0) { A=N%10; if(A>max) max=A; N=N/10; } min=ori%10; while(ori>0) { B=ori%10; if(B<min) min=B; ori=ori/10; } printf("%d %d",max,min); return 0; }
这段代码的功能是:读入一个整数,然后找出这个整数的各位数字中的最大值和最小值,并输出。

代码的思路是:先用一个循环找出最大值,再用另一个循环找出最小值。但这里有一个问题,就是初始值的设置。

- 在找最大值时,`max` 被初始化为 `N%10`,也就是原数的最后一位。这个做法是合理的,因为最大值至少会是某一位数字。
- 在找最小值时,`min` 被初始化为 `ori%10`,也就是原数的最后一位。这个做法也是合理的。

但是,代码中有一个潜在的错误:在第一个循环中,`N` 的值被不断除以10,直到变成0。当第一个循环结束时,`N` 已经变成了0。然后第二个循环使用 `ori` 来重新遍历原数,这没有问题,因为 `ori` 保存了原始值。

不过,请检查一下:如果输入的数字是负数,代码会如何处理?目前代码没有处理负数的情况,但题目可能只考虑正整数。

另外,请思考:如果输入的数字只有一位,比如 `5`,代码能否正确找出最大值和最小值?可以手动模拟一下。

- 提示1:检查变量 `max` 和 `min` 的初始值是否在所有情况下都合适。例如,如果所有数字都小于初始值,或者所有数字都大于初始值,会发生什么?这里初始值取自最后一位,所以对于一位数来说没问题,但对于多位数,初始值可能不是真正的最大值或最小值,但循环会更新它们。实际上这个初始值设置是可行的,因为循环会遍历所有位。

- 提示2:考虑代码的简洁性。是否可以用一个循环同时找出最大值和最小值?这样就不需要两个独立的循环了。但这不是错误,只是效率问题。