最大数max(x,y,z)

GitHub跳转原题关系图返回列表

三次调用 max3 代入公式后浮点除法,%.3f 保留三位小数输出。

OJ: roj

题目 ID: 1152

难度:入门

标签:入门语法函数浮点数python

创建: 2026-09-29 21:02

更新: 2026-10-05 03:45

题目描述

给定三个数 a,b,ca,b,c,计算 m=max⁡(a,b,c)max⁡(a+b,b,c)×max⁡(a,b,b+c)m=\dfrac{\max(a,b,c)}{\max(a+b,b,c)\times\max(a,b,b+c)},其中分子取三个原数的最大值,分母左因子把 aa 换成 a+ba+b、右因子把 cc 换成 b+cb+c。题面还要求把"求三个数的最大值 max⁡(x,y,z)\max(x,y,z)"分别定义成函数和过程来做。

输入:一行三个数 a,b,ca,b,c。输出:mm,保留到小数点后三位。样例输入 1 2 3:分子 max⁡(1,2,3)=3\max(1,2,3)=3,左因子 max⁡(3,2,3)=3\max(3,2,3)=3,右因子 max⁡(1,2,5)=5\max(1,2,5)=5,m=3/(3×5)=0.2m=3/(3\times5)=0.2,输出 0.200。

思路

按公式逐字代入:分子用函数版 max3 拿返回值,两个分母因子用过程版 max3_proc(C++ 用引用/全局输出参数模拟 Pascal 的 var 参数)写出结果。注意 1.0* 把整数除法抬成浮点除法,最后 printf("%.3f") 四舍五入保留三位小数即可,整体 O(1)O(1)。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 21:05
# update_at: 2026-09-29 21:05

import sys


def max3(x: int, y: int, z: int) -> int:
    """函数版求三个数的最大值:把结果作为返回值交回给调用者。"""
    top = x
    if top < y:
        top = y
    if top < z:
        top = z
    return top


def max3_proc(x: int, y: int, z: int, out: list[int]) -> None:
    """过程版求三个数的最大值:没有返回值,结果写进输出参数 out[0]。"""
    top = x
    if top < y:
        top = y
    if top < z:
        top = z
    out[0] = top


def solve() -> None:
    a, b, c = map(int, sys.stdin.read().split())

    numerator = max3(a, b, c)      # 分子 max(a, b, c):用函数版拿返回值
    out: list[int] = [0]           # 过程版的输出参数(相当于 Pascal 的 var 参数)
    max3_proc(a + b, b, c, out)
    left = out[0]                  # 分母左因子 max(a+b, b, c)
    max3_proc(a, b, b + c, out)
    right = out[0]                 # 分母右因子 max(a, b, b+c)

    m = numerator / (left * right)
    print(f"{m:.3f}")


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 03:45
 * update_at: 2026-10-05 03:45
 */

#include <cstdio>
#include <algorithm>
using namespace std;

typedef long long ll;

// 求三个数的最大值(题面要求定义成函数,用返回值交回结果)
ll max3(ll x, ll y, ll z) {
    ll top = x;
    if (top < y) top = y;
    if (top < z) top = z;
    return top;
}

ll a, b, c;      // 输入的三个数
ll out_proc;     // 过程版的输出参数(用全局变量模拟 Pascal 的 var 参数)

// 求三个数的最大值(题面要求定义成过程,无返回值,结果写进输出参数)
void max3_proc(ll x, ll y, ll z) {
    ll top = x;
    if (top < y) top = y;
    if (top < z) top = z;
    out_proc = top;
}

int main() {
    scanf("%lld %lld %lld", &a, &b, &c);

    // 分子:max(a,b,c),用函数版的返回值
    ll numerator = max3(a, b, c);

    // 分母左因子:max(a+b, b,c),用过程版的输出参数
    max3_proc(a + b, b, c);
    ll left = out_proc;

    // 分母右因子:max(a, b, b+c),再用一次过程版
    max3_proc(a, b, b + c);
    ll right = out_proc;

    // 1.0 * 抬成浮点除法,防止整数除法丢小数
    double m = 1.0 * numerator / (left * right);

    printf("%.3f\n", m);
    return 0;
}