入门 · 条件判断

三个数的最大值

读三个整数,输出最大的那个。听着简单 — 直到判题给你喂负数、并列值和全等输入。这道题的功课在边界情况。

一句话答案读入三个整数,用嵌套 if/else 或一路取最大值输出最大的那个;隐藏用例里有负数、重复值和三数相等,所以把最大值初始化成 0 会错。

题目

输入: 一行,三个整数 a、b、c。

输出: 三者中的最大值。

样例:

输入输出
3 7 57
-1 -5 -3-1

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 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;
}