一种新的找零钱算法,俺自创的,请大虾批评指正

LM2500 2014-12-08 10:47:45
人民币有100,50,20 ,10,5,1,0.5,0.1, 0.05,0.02,0.01几种币值,现在属于一个币值,比如185.56元,求怎样分解为零钱,使所有零钱张数最少,比如255.55元的最少张数就是100元2张,50元一张,5元一张,5毛一张,5分一张,这样就是钱币数最少的分解,下面是代码,在VS2010中调试通过

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<int> result_ZS;//整数部分分解为多少种币值
vector<int> result_XS;//小数部分分解为多少种币值
void exchange_ZhengShu(string strZS);
void exchange_XiaoShu(string strXS);
void print_ZS();
void print_XS();

int input()
{
string str1="",strZhengShu="",strXiaoShu="",cursor="";
cout<<"开始,请输入钱数:"<<endl;
fflush(stdin);
getline(cin,str1,'\n');

cursor+=str1;

if(cursor==""||str1=="")
{
printf("输入不能为空值\n");
system("pause");
return 0;
}

string str2=".";
int mark=0,bitnum=0;
int pos=cursor.find(str2);
if(pos==-1)//不含小数点
{
mark=0;
}
if(pos!=-1)//含有小数点
{
mark=1;
}
//cout<<"pos: "<<pos<<endl;
//cout<<"mark: "<<mark<<endl;
if(mark==0)//不含小数点
{
cursor+=".00";
string in1="",in2="";
in1+=cursor;
in2+=cursor;
exchange_ZhengShu(in1);
exchange_XiaoShu(in2);
print_ZS();
print_XS();
system("pause");
return 0;
}

if(mark==1)//含有小数点
{
if(cursor[0]=='.')//如果首位是小数点
{
string aaa="";
aaa+=cursor;
cursor="";
cursor+="0";
cursor+=aaa;
aaa="";
}
int mmm=cursor.length();
if(cursor[mmm-1]=='.')//如果末位是小数点
{
//cout<<"+00之前: "<<cursor<<endl;
cursor+="00";
//cout<<"+00之后: "<<cursor<<endl;
}
if(cursor[mmm-2]=='.')//如果倒数第二位是小数点
{
//cout<<"+0之前: "<<cursor<<endl;
cursor+="0";
//cout<<"+0之后: "<<cursor<<endl;
}
//printf("length: %d\n",cursor.length());

string in1="",in2="";
in1+=cursor;
in2+=cursor;
exchange_ZhengShu(in1);
exchange_XiaoShu(in2);
print_ZS();
print_XS();
return 0;
}
}

void exchange_ZhengShu(string strZS)
{
string innerStr="";
vector<int> bizhi;//共有多少种币值

while(strZS[0]!='.')
{
innerStr+=strZS[0];
strZS.erase(0,1);
}

bizhi.push_back(100);
bizhi.push_back(50);
bizhi.push_back(20);
bizhi.push_back(10);
bizhi.push_back(5);
bizhi.push_back(1);

int ZhengShu=atoi(innerStr.c_str());//整数部分钱数
int i=0;

while(ZhengShu>0)
{
if(ZhengShu>=bizhi[i])
{
int cursor=bizhi[i];
result_ZS.push_back(cursor);
ZhengShu=ZhengShu-cursor;
cursor=0;
}
if(ZhengShu<bizhi[i]&&ZhengShu>0)
{
i++;
}
}
}

void exchange_XiaoShu(string strXS)
{
vector<int> bizhi;//共有多少种币值
string innerStr="";

bizhi.push_back(50);
bizhi.push_back(10);
bizhi.push_back(5);
bizhi.push_back(2);
bizhi.push_back(1);

while(strXS[0]!='.')
{
strXS.erase(0,1);
}
strXS.erase(0,1);

for(int b=0;b<=1;b++)
{
innerStr+=strXS[0];
strXS.erase(0,1);
}
int XiaoShu=atoi(innerStr.c_str());//小数部分钱数

int i=0;
while(XiaoShu>0)
{
if(XiaoShu>=bizhi[i])
{
int cursor=bizhi[i];
result_XS.push_back(cursor);
XiaoShu=XiaoShu-cursor;
cursor=0;
}
if(XiaoShu<bizhi[i]&&XiaoShu>0)
{
i++;
}
}
}

void print_ZS()
{
int zhibizhangshu=result_ZS.size();
zhibizhangshu+=result_XS.size();

printf("共有钱币张数:%d\n",zhibizhangshu);

for(int a=0;a<result_ZS.size();a++)
{
printf("币值: %d\n",result_ZS[a]);
}
}
void print_XS()
{
vector<float> result_XS_Float;
for(int b=0;b<result_XS.size();b++)
{
if(result_XS[b]==50)
{
result_XS_Float.push_back(0.5);
}
if(result_XS[b]==10)
{
result_XS_Float.push_back(0.1);
}
if(result_XS[b]==5)
{
result_XS_Float.push_back(0.05);
}
if(result_XS[b]==2)
{
result_XS_Float.push_back(0.02);
}
if(result_XS[b]==1)
{
result_XS_Float.push_back(0.01);
}
}

for(int a=0;a<result_XS_Float.size();a++)
{
printf("币值: %.2f\n",result_XS_Float[a]);
}
}

int main()
{
input();
system("pause");
}
...全文
315 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xionggch 2014-12-09
  • 打赏
  • 举报
回复
可以把所有关于钱的数值*100,就不用分小数处理了
bear234 2014-12-09
  • 打赏
  • 举报
回复
第一、从不看超过20行代码的帖子----如果提问者不能把自己的问题抽象到十几行代码,就是伸手党,根本不看; 第二、从不看只发题目没有自己想法的伸手贴 第三、算法题居然发代码表示................无语......
Keep___Going 2014-12-09
  • 打赏
  • 举报
回复
个人建议: 这问题你可以考虑按金钱的单位来分解数据,单位为100元、单位10元,单位为1元、单位为1毛、单位为1分。 就拿你举得例子255.55,拆分200元,50元,5元,5毛,5分。 单位为100元的你都不用考虑(都是100),单位为10元的你建个9*3的数组,表示10,20,30,40,50......80,90每个数据可以分解的方法,也就是他们可以分解成几张10元、20元、50元的最优组合。 比如 创建Money【9】【3】的数组, Money【8】【0】记录90元面值分解时10元的数目,最优为0 Money【8】【1】记录90元面值分解时20元的数目,最优为2 Money【8】【2】记录90元面值分解时50元的数目,最优为1 Money【0】【0】记录10元面值分解时10元的数目,最优为1 Money【0】【1】记录10元面值分解时20元的数目,最优为0 Money【0】【2】记录10元面值分解时50元的数目,最优为0 单位为1元的你建个9*2的数组,表示1,2,3,4,5......8,9每个数据可以分解的方法,也就是他们可以分解成几张1元、5元的最优组合。 比如 创建Money【9】【2】的数组, Money【8】【0】记录9元面值分解时1元的数目,最优为4 Money【8】【1】记录9元面值分解时5元的数目,最优为1 Money【0】【0】记录1元面值分解时1元的数目,最优为1 Money【0】【1】记录1元面值分解时5元的数目,最优为0 接下来单位为1毛的和1分的和上述一样,建数组记录好 当你将这些都做好以后,每次输入数据,你只要将数据拆分成相应单位的组合,再到对应的数组中取数据就行了,无论你输入什么样的数据,都能找到对应的分解 如就拿你举得例子255.55,拆分200元,50元,5元,5毛,5分。 50元:去10元数组中取 5元:去1元数组中取 5毛:去1毛数组中取 5分:去1分数组中取 个人建议,仅供参考 -_-
Keep___Going 2014-12-09
  • 打赏
  • 举报
回复
就当锻炼锻炼思维,挺好的
勤奋的小游侠 2014-12-08
  • 打赏
  • 举报
回复
写得太乱了,既然是用c++,给二个建议你: 1函数名的命名用英文,不要用拼音 2用类来实现算法,而不要再像c语言一样定义那么多的全局变量和函数
bravery36 2014-12-08
  • 打赏
  • 举报
回复
写得太乱懒得看。找零算法的难点在于某些钱不够的时候怎么处理,不做这类处理的算法都没有实用价值。
橡木疙瘩 2014-12-08
  • 打赏
  • 举报
回复
贪婪法。 文本处理和具体算法混杂在一起,太乱了。
赵4老师 2014-12-08
  • 打赏
  • 举报
回复
基本没什么实用价值。
蓝兔先生 2014-12-08
  • 打赏
  • 举报
回复
不知所云阿!

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧