啤酒和饮料
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
double sum = 82.3;
double left;
double j;
double pijiu=2.3, yinliao=1.9;
for (int i = 1; i <= 100; i++) //买了i瓶啤酒
{
left = sum - pijiu * i;
if (left < 0) break;
j = left / yinliao;
if ((j-(int)j)==0)
printf("啤酒:%d,饮料:%lf\n", i, j);
}
return 0;
}
这道题有点迷惑,如果把变量改为float型
就没有办法输出正常的结果
最后再调试过程种发现了有意思的现象:
啤酒11和啤酒30
i=11时
left=82.3-11*2.3=57;
j=57/yinliao(1.9)=30应该是一个整数,但是计算结果却是30.0000002
i=30时
left=82.3-30*2.3=13.3
j=57/yinliao(1.9)=7也应该是一个整数,但是输出却是7.0000002
最后通过调试发现:
float left = (float)82.3 - i * (float)2.3; 所得到的left为57.000004
而
float left=82.3-i*(float)2.3 所得到的left为正确的57.00000
很明显是前方的(float) 强制转换出了问题;
于是做了一个小实验,我运行了下方的代码:
printf("%f\n", (float)82.3);
结果如下图
很迷,输入的82.3变成了82.30003
另外
运行下列的代码:
double left = 82.3 - 30*2.3;
double j = left / 1.9;
printf("j的值为%lf\n", j);
printf("(int)7.00000的值为 %d\n", (int)7.00000);
printf("(int)j的值为%d\n", (int)j);
printf(" j - (int)j的值为%lf", j - (int)j);
结果如下图
这说明,在经过运算后,j变成了很接近7但是不是7的数(6.9999999999?)
所以if ((j-(int)j)==0) 判断浮点数是不是整数,不靠谱
abs(round(j) - j) < 0.000000000000001这个就可以正常执行
所以最后ac的代码为:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
double sum = 82.3;
double left;
double j;
double pijiu = 2.3, yinliao = 1.9;
for (int i = 1; i <= 100; i++) //买了i瓶啤酒
{
left = sum - pijiu * i;
if (left < 0) break;
j = left / yinliao;
if (abs(round(j) - j) < 0.000000000000001)
printf("啤酒:%d,饮料:%lf\n", i, j);
}
return 0;
}
输出结果为:
看似简单的题目里暗藏这么多知识点,看来是我太菜了😭😭