啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
思路:水题不水,本来我的代码是这样的。
#include<iostream>
using namespace std;
int main(){
for(int y=2;;y++){
for(int x=1;x<y;x++){
if(2.3*x+1.9*y==82.3){
cout<<x<<" "<<y<<endl;
return 0;
}
}
}
return 0;
}
反复思考觉得代码逻辑没有错,应该错在细节处理上,于是上网查了别人的做法,发现他们没有直接“==”,而是采用数学上极限的思想,判断结果是否落在82.3的领域上。
于是我的代码改成以下形式,果然出结果了。
#include<iostream>
using namespace std;
#define eps 1e-8
int main(){
for(int y=2;;y++){
for(int x=1;x<y;x++){
if(2.3*x+1.9*y>=(82.3-eps)&&2.3*x+1.9*y<=(82.3+eps)){
cout<<x<<" "<<y<<endl;
return 0;
}
}
}
return 0;
}
别人代码:
#include <math.h>
#define eps 1e-8
int main()
{
int x,y,flag=0;
for(x=1;x<36;x++)
{
for(y=1;y<44;y++)
{
if(fabs((2.3*x+1.9*y)-82.3)<eps&&x<y)
{
printf("%d\n",x);
flag=1;
break;
}
}
if(flag==1)
break;
}
return 0;
}
总结:判断浮点数是否相等时,通常不使用“==”、“!=”之类的运算符,而是用数学函fabs()求两数之差绝对值,再与自定义eps(通常为1e-6、1e-8)比较。