题解
最大数进阶版
1 条题解
-
0
解题思路
这道题给出公式:
m = max(a,b,c) / ( max(a+b,b,c) × max(a,b,b+c) )
要求把“求三个数的最大值”分别定义成函数和过程来做,所以我们定义一个 max3(x, y, z) 函数,返回 x、y、z 三个数中的最大值。
max3 的实现方法:
- 先假设 m = x;
- 如果 y 比 m 大,就把 m 更新成 y;
- 如果 z 比 m 大,就把 m 更新成 z;
- 最后 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