【题目链接】
ybt 1050:骑车与走路
OpenJudge NOI 1.4 12:骑车与走路
【题目考点】
1. 两浮点型量判断相等
由于浮点型量在内存中以二进制形式表示,很多数据并不能精确表示(如0.3),实际存储的是一个近似值。而由于计算过程不同,对于数学意义上相等的两个数字,在实际存储时会有差别,以至于用==判定两个数是否相等时,表达式的值是false。
例:
double a = 0.3, b = 0.1+0.2;
cout<<(a==b);//会输出0,表示在程序层面,不认为a与b是相等的。
要解决这一问题,就是要忽略浮点型量之间的细微差别。
只要两个浮点型量之间相差的值很小,就认为是相等的。
判断浮点型量a,b是否相等的表达式:fabs(a-b) < 0.00001
(右侧是一个很小的数字即可。)
2. if…else if…else语句
【解题思路】
设总距离为s米
- 已知步行速度1.2米每秒,步行所用时间 t w = s / 1.2 t_w = s / 1.2 tw=s/1.2
- 已知骑车前后所用的时间为 27 + 23 = 50 27+23=50 27+23=50秒,骑车速度3米每秒,骑车所用时间 t b = s / 3 + 50 t_b = s / 3 + 50 tb=s/3+50
- 比较
t
w
t_w
tw与
t
b
t_b
tb,输出对应的字符串。
由于浮点型量相等时可能被程序认为是不等的(如数学上a等于b但实际判断时a>b返回true),所以应先判断二者是否相等。
【题解代码】
写法1:先判断两数是否相等
#include<bits/stdc++.h>
using namespace std;
int main()
{
double s, tw, tb;//s:距离,tw:走路所用时间,tb:骑车所用时间
cin >> s;
tw = s / 1.2;
tb = 27 + 23 + s / 3;
if(fabs(tw - tb) < 0.0001)//判断浮点型量tw与tb是否相等
cout << "All";
else if(tw > tb)//走路用的时间比骑车多
cout << "Bike";//骑车更快
else//骑车用的时间比走路更多
cout << "Walk";//走路更快
return 0;
}
写法2:先判断两数是否一个比另一个大
#include<bits/stdc++.h>
using namespace std;
int main()
{
double s, tw, tb;//s:距离,tw:走路所用时间,tb:骑车所用时间
cin >> s;
tw = s / 1.2;
tb = 27 + 23 + s / 3;
if(tw > tb)//走路用的时间比骑车多
cout << "Bike";//骑车更快
else if(tw < tb)//骑车用的时间比走路更多
cout << "Walk";//走路更快
else//判断浮点型量tw与tb是否相等
cout << "All";
return 0;
}