入门 · 条件判断
三个数的最大值
读三个整数,输出最大的那个。听着简单 — 直到判题给你喂负数、并列值和全等输入。这道题的功课在边界情况。
一句话答案读入三个整数,用嵌套 if/else 或一路取最大值输出最大的那个;隐藏用例里有负数、重复值和三数相等,所以把最大值初始化成 0 会错。
题目
输入: 一行,三个整数 a、b、c。
输出: 三者中的最大值。
样例:
| 输入 | 输出 |
|---|---|
3 7 5 | 7 |
-1 -5 -3 | -1 |
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。
卡住了?提示
提示 1 — 打擂台模式
别三个一起比。先假设第一个最大:int m = a;,然后逐步改进:if (b > m) m = b;,if (c > m) m = c;。两次简单比较胜过一堆嵌套 if/else — 同样的模式以后能扩展到整个数组。
提示 2 — 负数为什么坑人
如果从 int m = 0; 开始取最大,输入 -1 -5 -3 会错误地输出 0。打擂台的初始值必须是输入里的真实值,不能是拍脑袋的常数。
题解(先自己试试!)
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int m = a;
if (b > m) m = b;
if (c > m) m = c;
cout << m << endl;
return 0;
}
并列和全等的输入在这里自动正确 — > 遇到相等就保持现状。打擂台模式和循环题里的累加器是同一家人;下一题:数一数位数。
深度解析
为什么这样做对
打擂台(best = max(best, x))能扩展到任意多个输入,而三分支的 if/else 树不能。优先选能推广的形状。
代价
两种写法都是 O(1),三次比较。性能没有差别,可维护性差别很大。
常见错法
if (a > b) if (a > c)会漏掉相等的情况,也会漏掉 a 最小的情况。改成跟当前最大值比较。best = 0初始化在全负数输入上直接错。用输入里的真实值起手。
下一步
同一个思路扩展到整个数组:数组最大值。
记住这两句
- 打擂台比决策树更值得写——它能推广。
- 最大值的初值必须来自数据,不能拍 0。
🐞 这段是错的 —— 点开,亲手让它挂一次
最大值初值写成 0,全负数输入直接错
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int best = 0;
if (a > best) best = a;
if (b > best) best = b;
if (c > best) best = c;
cout << best << endl;
return 0;
}