您的位置:首页 > 编程语言 > C语言/C++

C++小练习—找零钱问题

2017-12-11 21:21 141 查看
采用贪心算法解决找零钱问题,如果需要找零57.8元,零钱数分别为(10元、5元、1元、5角、2角、1角)

1、采用元为单位编写程序如下所示:

[cpp] view
plain copy

#include<iostream>  

  

using namespace std;  

  

int main()  

{  

    float total=0.0;  

    cout<<"请输入需要找的零钱数:";  

    cin>>total;  

    float sum=total;  

    const float a[]={10,5,1,0.5,0.2,0.1};  

    int i,b[6]={0};  

    for(i=0;i<6;++i)  

    {  

        b[i]=total/a[i];  

        total=total-b[i]*a[i];  

    }  

    cout<<"得到的结果为:"<<sum<<"=";  

    for( i=0;i<5;i++)  

    {  

        cout<<b[i]<<"*"<<a[i]<<"+";  

    }  

    cout<<b[i]<<"*"<<a[i]<<endl;      

    system("pause");  

    return 0;  

}  

运行结果为:57.8=5*10+1*5+2*1+1*0.5+1*0.2+0*0.1

最后一位出现错误,导致实际结果只有57.7。

2、出现该错误的原因

        单步调试程序发现当输入57.8时,计算机实际存储的是57.799999,以致最后剩下的0.1元变成0.099999,0.099999/0.1=0。

     计算机中对于浮点数的存储:

按照IEEE的浮点数表示方法,把浮点数57.8转换为二进制代码。整数部分为57=32*1+16*1+8*1+4*0+2*0+1*1,得到其二进制表示为:111001,小数部分0.8=0.5*1+0.25*1+0.125*0+0.0625*0+0.03125*1+.....,永远算不完,所以导致存储时存在误差。

3、解决办法

转而采用角为单位,对输入数据作放大处理(乘以10),程序代码如下:

[cpp] view
plain copy

#include<iostream>  

  

using namespace std;  

  

int main()  

{  

    float total;  

    cout<<"请输入需要找的零钱数:";  

    cin>>total;  

    const float a[]={10,5,1,0.5,0.2,0.1};  

    int i,b[6]={0};  

    int temp,total1=total*10;  

    for(i=0;i<6;++i)  

    {  

        b[i]=total1/(a[i]*10);  

        temp=a[i]*10;  

        total1=total1-b[i]*a[i]*10;  

    }  

    cout<<"得到的结果为:"<<total<<"=";  

    for( i=0;i<5;i++)  

    {  

        cout<<b[i]<<"*"<<a[i]<<"+";  

    }  

    cout<<b[i]<<"*"<<a[i]<<endl;      

    system("pause");  

    return 0;  

}  

运行结果为:57.8=5*10+1*5+2*1+1*0.5+1*0.2+1*0.1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: