2014 年蓝桥杯 C 语言 B 组省赛第 1 题: 啤酒和饮料
作者:互联网
题目
标题:啤酒和饮料
啤酒每罐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
标签:11,int,浮点数,蓝桥,饮料,2014,include,啤酒,组省赛 来源: https://blog.csdn.net/wy_bk/article/details/88740247