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+.....,永远算不完,所以导致存储时存在误差。
转而采用角为单位,对输入数据作放大处理(乘以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
- C++小练习—找零钱问题
- C++小练习—找零钱问题
- 找零钱问题—贪心
- 动态规划——找零钱问题
- 贪心算法——找零钱问题
- 【动态规划】—找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- 找零钱问题
- shell 编程-函数
- ECharts配置
- 隔代育儿真那么可怕么?
- Phalcon编译安装
- jQuery,选择器,选择父页面的元素
- C++小练习—找零钱问题
- Lucence索引的存储
- 记录3——快速检查机器的各种实时错误日志并且及时定位问题———修订版1
- eclipse启动 java虚拟机报错 A fatal error has been detected by the Java Runtime Environment:
- 医疗信息化发展浅析
- MySQL中文乱码问题的解决 (2009-01-02 20:16:25)
- Opencv2系列学习笔记4(灰度直方图)
- 函数调用可以做为一个函数的形参
- Objective-C基础教程一