虽然本题说了使用 cout 的默认精度,但是未雨绸缪还是思考了一下保留有效数字的写法, ①思路一,想办法获取整数部分的长度,然后用总长度减去整数部分长度会好一点
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
double m, h, bim;
cin >> m >> h;
bim = m / (h * h);
if (bim > 24) {
cout << fixed << setprecision(6 - int(log10(bim) + 1));
cout << bim << endl;
cout << "Overweight";
}
else if (bim >= 18.5)
cout << "Normal";
else
cout << "Underweight";
return 0;
}
②思路二,我们知道printf("%m.ns",s)里的n可以截取有效长度,所以想办法把bim转char数组就好了,因为小数点也算一位,但是小数点不算有效位数,所以n=7
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double m, h, bim;
cin >> m >> h;
bim = m / (h * h);
if (bim > 24) {
char output[20];
sprintf(output, "%lf", bim);
printf("%.7s\n", output);
cout << "Overweight";
}
else if (bim >= 18.5)
cout << "Normal";
else
cout << "Underweight";
return 0;
}
这种方法我测试后没有保留小数,所以会错两个测试点,但是要保留几位小数也跟整数部分长度有关,这么一想这种方法就暂时保留吧