题目
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!
解答
#include <stdio.h>
#include <cmath>
#include <iostream>
#include<cstdio>
using namespace std;
//const double esp = 1e-6;
int main()
{
int num;
cin>>num;
for(int i=0;i<num;++i)
{
double shenggao,tizhong;
cin>>shenggao>>tizhong;
//cout<<ibm<<" "<<(int&)ibm<<" "<<biaozhun*0.1<<" "<<(int&)biaozhun*0.1<<endl;
if(abs(tizhong-(shenggao-100)*1.8)<(shenggao-100)*1.8*0.1) cout<<"You are wan mei!"<<endl;
else
{
if(tizhong-(shenggao-100)*1.8<(shenggao-100)*1.8*0.1) cout<<"You are tai shou le!"<<endl;
else cout<<"You are tai pang le!"<<endl;
}
}
return 0;
}
知识点
- abs()
这里必须说一下cmath和math.h:
math.h是C语言的头文件。
其实在C++中用math.h也是可以的,C++是兼容C的。
不过推荐的是使用#include <cmath>
不过这样必须声明在std命名空间dao:using namespace std;
其中的函数和使用方法几乎完全相同。
类似的:
<string.h>在c++的头文件为<cstring>
<math.h>在c++的头文件为<cmath>
在实验中发现:如果使用<math.h>,abs不能直接接收double类型的参数,反而要使用fabs()!!而<cmath>则可以直接使用abs()
C\C++ 中的绝对值函数:abs()、cabs()、fabs()、labs() - 双精度的比较,简单来说,在计算机里面,看起来相等的浮点型数相等,实际上其后面后面后面的小数可能会不一样。
#include <iostream>
using namespace std;
void main()
{
double epsilon=0.001;
double d1=2.334;
double d2=2.335;
cout << "epsilon is: " << epsilon << endl;
cout << "d2-d1 is: " << d2-d1 << endl;
if ((d2 - d1) == epsilon){
cout << "Equal!" << endl;
}
else{
cout << "Not equal!" << endl;
}
}
其输出结果实际上是:
epsilon is: 0.001
d2-d1 is: 0.001
Not equal!
为何会这样呢?让我们稍微调整一下上面的代码:
cout<<"epsilon is: "<< setprecision(20) << epsilon<<endl;
cout<<"d2-d1 is: "<< setprecision(20) << d2-d1 <<endl;
可以得到:
epsilon is: 0.00100000000000000000
d2-d1 is: 0.00099999999999988987
这里引出一条C/C++中非常重要的原则:
The important rule to remember is that powers of two and integer multiples thereof can be perfectly represented. everything else is an approximation.
直译过来意识就是,除了可以表示为2的幂次以及整数数乘的浮点数可以准确表示外,其余的数的值都是近似值。
解决办法:
- 精度由计算过程中需求而定。比如一个常用的精度为1e-6.也就是0.000001.
所以对于两个浮点数a,b,如果要比较大小,那么常常会设置一个精度
如果fabs(a-b)<=1e-6,那么就是相等了。 fabs是求浮点数绝对值的函数。
类似的 判断大于的时候,就是if(a>b && fabs(a-b)>1e-6)。
判断小于的时候,就是if(a<b&&fabs(a-b)>1e-6)。 - 使用
(int&)
将地址里的值看作int类型 - 直接计算,不放入任何变量地址之中??
C/C++ 浮点数比较问题
深入理解C++浮点数(float、double)类型数据比较、相等判断
【C++菜鸟问题】C++浮点数(float、double)比较、相等判断