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

来源:互联网 发布:禁毒网络知识竞赛网 编辑:程序博客网 时间:2024/05/01 08:33

采用贪心算法解决找零钱问题,如果需要找零57.8元,零钱数分别为(10元、5元、1元、5角、2角、1

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

#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),程序代码如下:

#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



0 0
原创粉丝点击