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
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
相关文章推荐
- C++小练习—找零钱问题
- C/C++链表练习时遇到的问题
- C++顺序表模板练习 以及 剖析易出现的浅拷贝问题
- 5.4.2节练习--- c++中多次cin会出现的问题。
- c++动态规划解决硬币换零钱的问题
- C++课程学习[5]-问题的模块化求解之相关练习
- GetMemory错误讲解(指针练习)----C++面试之GetMemory问题
- c++练习中遇到的问题和解决
- 用C++解决数学类问题的练习
- C++顺序表模板练习 以及 剖析易出现的浅拷贝问题
- [c/c++练习系列]多项式合并问题
- 第三周C++练习之汉诺塔问题
- C++ 练习02 ---- 魔术师发牌问题
- 基础练习 2n皇后问题
- 最大子数组问题-c++代码实现及运行实例结果
- Microsoft Visual C++ 6.0 (SP6) 中can not open include file "afxres.h"问题的解决方案
- 计算机科学概论(第11版) 1.1节 问题与练习答案
- C和C++的内存操作小贴士(一):const char*的内存释放问题
- C++里类中定义对象与定义局部变量的问题
- C++ Primer Plus(第六版)编程练习 第2章 开始学习C++