在线编译器 C

#include <stdio.h> int main(void) { int a, b, c, d, e, min, max, n; scanf("%d%d%d%d%d", &a, &b, &c, &d, &e); min = a; if (a <= b && a <= c && a <= d && a <= e) min = a; else if (b <= a && b <= c && b <= d && b <= e) min = b; else if (c <= b && c <= a && c <= d && c <= e) min = c; else if (d <= b && d <= c && d <= a && d <= e) min = d; else if (e <= b && e <= c && e <= d && e <= a) min = e; max = a; if (max < b) max = b; if (max < c) max = c; if (max < d) max = d; if (max < e) max = e; n = max * min; printf("%d", n); return 0; }
这段代码的功能是:读入5个整数,找出其中的最大值和最小值,然后输出它们的乘积。

代码中找最大值的方式是正确的:依次比较每个数,如果当前数比当前最大值大,就更新最大值。但找最小值的方式存在逻辑问题。

- 找最小值时,你用了多个 `else if` 条件,但每个条件都要求该数同时小于等于其他所有数。如果最小值出现多次(比如有两个相同的最小值),或者最小值恰好是第一个数 `a`,那么第一个 `if` 条件成立后,后面的 `else if` 就不会执行,这看起来没问题。但问题在于:如果最小值不是 `a`,比如是 `b`,那么第一个条件 `a <= b && a <= c && a <= d && a <= e` 为假,进入第二个条件 `b <= a && b <= c && b <= d && b <= e`,这个条件成立,所以 `min = b` 正确。但假如最小值是 `c`,而 `b` 比 `a` 小但比 `c` 大,那么第二个条件 `b <= a && b <= c && ...` 中 `b <= c` 为假,所以不会进入,继续检查第三个条件,这样也能找到。所以这段代码实际上能正确找出最小值,但写法非常冗余且容易出错。

- 更简洁的方法是像找最大值那样,用一系列独立的 `if` 语句来更新最小值,而不是用 `else if` 链。例如:先设 `min = a`,然后如果 `b < min` 则 `min = b`,如果 `c < min` 则 `min = c`,以此类推。这样代码更清晰,也更容易维护。