蓝桥杯2014C++ B组 1_啤酒和饮料

啤酒和饮料

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

输出结果为:
根据题意选择正确的答案就行了
看似简单的题目里暗藏这么多知识点,看来是我太菜了😭😭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值