题目
标题:啤酒和饮料
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。
注意:答案是一个整数。请通过浏览器提交答案。
不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。
题目分析
这里使用使用循环暴力破解即可, 根据啤酒和饮料的价格以及一共花费了八十多块钱可以大致估计, 啤酒的数量不会超过 50 罐, 饮料的价格不会超过 60 罐, 由于有啤酒和饮料两个, 因此用两个嵌套的 for 循环对其进行遍历即可.
下面先来看一个有问题的程序.
下面这个程序在逻辑上是符合的, 但是无法运行出结果:
#include <iostream> using namespace std; int main(){ for (int i=1; i<=50; i++){ for (int j=1; j<=60; j++){ if((i<j)&&(i*2.3+j*1.9==82.3)){ cout<<i<<" "<<j<<endl; } } } return 0; }
无法出结果的原因是, 如果参与运算的有浮点数, 那个其运算结果是不能用于比较是否相等的 (“==”两边不能是浮点数), 因为浮点数的精度不同可能导致两个本来相同的浮点数不相等.
正确的比较方法是计算两个数的差值, 如果差值小于一个极小的数就表明这两个数字是相等的, 正确的程序如下:
#include<iostream> #include<cmath> using namespace std; int main(){ for (int i=1; i<=50; i++){ for (int j=1; j<=60; j++){ if((i<j)&&abs((i*2.3+j*1.9) - 82.3)<0.0000000000001){ //abs()库函数用于求绝对值 cout<<i<<" "<<j<<endl; } } } return 0; }
运行结果:
11 30
当然, 本题也可以通过将题目中给出的数据都扩大 10 倍, 将浮点类型转换成 int 类型之后再计算, 程序如下:
#include<iostream> #include<bits/stdc++.h> using namespace std; int main(){ for(int pj=1;pj<60;pj++){ for(int yl=1;yl<60;yl++){ if(pj<yl&&pj*23+yl*19==823){ cout<<"啤酒:"<<pj<<endl; cout<<"饮料:"<<yl<<endl; } } } return 0; }
运行结果:
啤酒:11 饮料:30
其中 11 是啤酒的罐数且满足啤酒的罐数小于饮料的罐数 (可以在得出结果后使用 PC 中的计算器验证一下).
本题正确答案:
11