1 条题解

  • 0
    @ 2026-10-8 21:09:25

    肥胖问题

    一个自然的想法

    BMI = 体重除以身高的平方,然后按三段输出,判断本身没有任何难度。这题真正的麻烦藏在输出要求里:肥胖时不仅要输出 BMI 值,还要求"保留六位有效数字、小数部分末尾的 0 不输出"。

    突破口:%g 恰好就是题目要的格式

    "六位有效数字"和"保留六位小数"是两回事:123.4567 要输出成 123.457(共 6 位数字),5432.10 要输出成 5432.1(去掉末尾的 0)。

    C 语言的 printf 有个现成的格式符正好符合:%g——默认保留 6 位有效数字,并自动去掉末尾的 0。验证一下样例:100 / 1.68² = 35.4308…,用 %g 输出正是 35.4308。

    所以整题就三件事:用 double 读入、算 BMI、按区间输出,其中 Overweight 分支用 %g 打印数值。

    代码实现

    #include <stdio.h>
    
    int main() {
        double m, h;
        scanf("%lf%lf", &m, &h);
        double bmi = m / (h * h);
        if (bmi < 18.5)
            printf("Underweight");
        else if (bmi < 24)
            printf("Normal");
        else {
            printf("%g\n", bmi);   /* %g:6位有效数字,自动去末尾0 */
            printf("Overweight");
        }
        return 0;
    }
    

    注意 bmi < 24 的写法:既然第一个分支已经排除了小于 18.5 的情况,这里不必再写 bmi >= 18.5 && bmi < 24,条件天然成立。

    容易出错的细节

    1. 用 %f 或 %.6f 输出 BMI 会错:那是"6 位小数",不是"6 位有效数字",35.4308 会变成 35.430833。
    2. 身高要用 double 读入(%lf):如果误用 int 读,1.72 变成 1,h² = 1,BMI 直接变成体重值。
    3. 肥胖分支要输出两行:先数值再 Overweight,漏掉中间的换行会把两行挤在一起。

    复杂度

    时间与空间复杂度均为 O(1)。

    这题的本质:一道分段函数求值题,外加认识 %g 这个"6 位有效数字"格式符——它以后在所有"输出浮点数但不指定小数位"的场合都适用。

    • 1

    信息

    ID
    516
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    8
    已通过
    3
    上传者