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

#include <stdio.h> int main() { int a, b, c, d, e, min; scanf("%d%d%d%d%d" ,&a ,&b ,&c ,&d ,&e); min = a; if (a>=b){ min=b; } if (b>=c){ min=c; } if (c>=d){ min=d; } if (d>=e){ min=e; } printf("%d" , min); return 0; }
这段代码试图找出5个整数中的最小值,但逻辑有误。它逐个比较相邻的两个数,每次将较小的赋给min,但这种方法不能保证最终得到全局最小值。

- 你的比较逻辑是单向的:只有当a>=b时才把min设为b,但忽略了a本来就比b小的情况。正确的思路应该是每次比较当前min和下一个数,如果下一个数更小,就更新min。
- 例如输入5 4 3 2 1,你的代码会正确输出1,但输入1 2 3 4 5时,由于a>=b不成立,min始终是a=1,这恰好正确,但输入2 1 3 4 5时,a>=b成立,min变成1,然后b>=c不成立,min保持1,结果正确。然而输入3 2 1 4 5时,a>=b成立,min=2,然后b>=c成立,min=1,之后c>=d不成立,min=1,正确。但输入5 4 3 2 1时,a>=b成立,min=4,b>=c成立,min=3,c>=d成立,min=2,d>=e成立,min=1,正确。实际上这个代码对递减序列有效,但对非单调序列可能出错,比如输入2 5 1 4 3,a>=b不成立,min=2,然后b>=c成立,min=1,之后c>=d不成立,min=1,d>=e不成立,min=1,结果正确。再测试一个反例:输入1 3 2 5 4,a>=b不成立,min=1,b>=c成立,min=2,c>=d不成立,min=2,d>=e成立,min=4,最终输出4,但实际最小值是1。所以问题在于:当min已经比当前比较的数小时,你仍然可能因为后续比较而错误地更新min。正确的做法是始终用当前min与下一个数比较。