2014 年蓝桥杯 C 语言 B 组省赛第 1 题: 啤酒和饮料

版权声明:本文为荒原之梦原创文章,版权归 ZhaoKaiFeng.com 所有. https://blog.csdn.net/wy_bk/article/details/88740247

题目

标题:啤酒和饮料

啤酒每罐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;
}

运行结果:

扫描二维码关注公众号,回复: 5614341 查看本文章
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

猜你喜欢

转载自blog.csdn.net/wy_bk/article/details/88740247