top1编程
← 返回题目
题解

最大数进阶版

1 条题解

  • 0
    @ 2026-8-5 16:07:42

    解题思路

    这道题给出公式:

    m = max(a,b,c) / ( max(a+b,b,c) × max(a,b,b+c) )

    要求把“求三个数的最大值”分别定义成函数和过程来做,所以我们定义一个 max3(x, y, z) 函数,返回 x、y、z 三个数中的最大值。

    max3 的实现方法:

    1. 先假设 m = x;
    2. 如果 y 比 m 大,就把 m 更新成 y;
    3. 如果 z 比 m 大,就把 m 更新成 z;
    4. 最后 m 就是最大值。

    然后按照公式,分子是 max3(a, b, c),分母是 max3(a+b, b, c) 和 max3(a, b, b+c) 相乘。

    注意:m 是除法结果,可能是小数,而且题目要求保留三位小数输出,所以:

    • 用 double 类型保存 a、b、c,避免整数除法丢精度;
    • 用 printf("%.3f", ...) 保留三位小数。

    验证样例 a=1, b=2, c=3:

    • max(1,2,3) = 3
    • max(1+2,2,3) = max(3,2,3) = 3
    • max(1,2,2+3) = max(1,2,5) = 5
    • m = 3 / (3 × 5) = 3 / 15 = 0.2,保留三位是 0.200,和样例一致。

    参考代码

    // P4597 最大数进阶版:用 max3 函数求三个数的最大值,再按公式计算 m
    #include <iostream>
    #include <cstdio>    // 使用 printf 保留小数点后三位
    using namespace std;
    
    // 返回 x、y、z 三个数中的最大值
    double max3(double x, double y, double z) {
        double m = x;
        if (y > m) m = y;   // y 更大就更新
        if (z > m) m = z;   // z 更大就更新
        return m;
    }
    
    int main() {
        double a, b, c;
        cin >> a >> b >> c;
        // 分子是 max(a,b,c),分母是两个 max 相乘
        double up = max3(a, b, c);
        double down = max3(a + b, b, c) * max3(a, b, b + c);
        printf("%.3f\n", up / down);   // 保留三位小数输出
        return 0;
    }
    

    复杂度分析

    无论输入多大,max3 函数都只需要比较两次,程序里只调用了三次 max3,总共是常数次操作,时间可以看成 O(1)。空间也是 O(1)。

    • 1