计算 BMI 后按区间分支,超重时用 .6g 输出六位有效数字。
OJ: luogu
题目 ID: P5714
难度:入门
标签:python入门条件判断浮点
日期: 2026-07-15 18:07
题意
输入体重 m 和身高 h,计算 BMI:
如果 BMI 小于 18.5 输出 Underweight;如果小于 24 输出 Normal;否则先输出 BMI,再输出 Overweight。
思路
先计算 bmi = m / (h * h),再按区间判断:
bmi < 18.518.5 <= bmi < 24bmi >= 24
Python 中按顺序写 if / elif / else,第二个分支只需要写 bmi < 24,因为能到这里说明前一个条件已经不成立。
brute.py 不适合这题,因为它是公式计算和区间分支题。
Python 知识
map(float, input().split())读取浮点数。h * h表示,比写 h ** 2更直观也可以。if / elif / else适合互斥区间分类。f"{bmi:.6g}"表示六位有效数字,并自动去掉不必要的后缀0,符合本题非 C++ 输出要求。
对应的本地 Python 笔记:
/home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:浮点输入与输出。/home/rainboy/mycode/hugo-blog/content/program_language/python/oj_input_output_cheatsheet.md:控制浮点输出格式。/home/rainboy/mycode/hugo-blog/content/program_language/python/math_tools.md:浮点数注意事项。
代码
python
m, h = map(float, input().split())
bmi = m / (h * h)
if bmi < 18.5:
print("Underweight", end="")
elif bmi < 24:
print("Normal", end="")
else:
print(f"{bmi:.6g}\nOverweight", end="")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-07-27 00:00
* update_at: 2026-07-27 00:00
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
double m, h; // 体重(kg),身高(m)
cin >> m >> h;
double bmi = m / (h * h);
if (bmi < 18.5) {
cout << "Underweight" << endl;
} else if (bmi < 24) {
cout << "Normal" << endl;
} else {
// 超重时先输出 BMI(六位有效数字),再输出 Overweight
printf("%.6g\nOverweight\n", bmi);
}
return 0;
}Pythonic 写法
match-case:
python
m, h = map(float, input().split())
bmi = m / (h * h)
match bmi:
case x if x < 18.5:
print("Underweight", end="")
case x if x < 24:
print("Normal", end="")
case _:
print(f"{bmi:.6g}\nOverweight", end="")match-case 写法
BMI 区间分类可用 guard 写成区间匹配:
python
m, h = map(float, input().split())
bmi = m / (h * h)
match bmi:
case x if x < 18.5:
print("Underweight", end="")
case x if x < 24:
print("Normal", end="")
case _:
print(f"{bmi:.6g}\nOverweight", end="")复杂度
只做常数次浮点运算和比较,时间复杂度
总结
区间分类题适合按边界从小到大写分支。浮点输出要仔细看题面是“几位小数”还是“几位有效数字”,本题是有效数字。