一个找零程序算法问题

wuyan16001 2008-10-24 12:22:01
一个找零程序,输出应找补金额,找零面值50,20,10,5,2,1.要求找零的张数最少,不考虑缺面值的情况。比如:应找补30元,输出找零:应找补30元,20元一张,10元一张(不是10元3张或者其他)。

问题:怎么设计算法,让程序最有效。而不是一味的用IF的语句。
...全文
399 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengyancenji 2011-05-14
  • 打赏
  • 举报
回复
定义一个int a[i] 第i种面值有几张,a[i]=p/mianzhi[i];float 型 p为要找回的零钱,float mianzhi[i]={50,20,10,5,1,0.5,0.2,0.1} 这样就OK了,
p=p-mianzhi[i]*a[i]+0.01;这0.01是因为VC++6.0和TC等等里面的0.1是0.0999948造成的,
morningnet 2010-11-28
  • 打赏
  • 举报
回复
Lingqian(int zhaoling)
{
int a[];
a[0]=50;
a[1]=20;
a[2]=10;
a[3]=5;
a[4]=2;
a[5]=1;

int i=0;
for(i=0;i<=5;i++)
{
while(zhaoling-a[i]>=0)
{
zhaoling=zhaoling-a[i]
printf a[i];
}

}

}

morningnet 2010-11-28
  • 打赏
  • 举报
回复
把面值存入数组,从大到小排序,然后递归或循环计算
zhouhupingluo 2008-10-25
  • 打赏
  • 举报
回复
这个是动态规划或贪心法教科书级题目,随便一本算法书上都有的。
liumingrong 2008-10-24
  • 打赏
  • 举报
回复
贪心算法很有效
尽可能用大面值的倍数去减
镜机 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyan16001 的回复:]
引用 2 楼 luansxx 的回复:
给一张表

1 = 1
2 = 2
3 = 2 + 1
4 = 2 + 2
5 = 5
6 = 5 + 1
7 = 5 + 2
8 = 5 + 2 + 1
9 = 5 + 2 + 2

十位数同理

不可能有百位数吧


如果是这样,那要找99块,岂不是要建立从1到99个数的表呀。
那好像效率比较慢
[/Quote]
效率慢?好算法我觉得就是这样。
wuyan16001 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luansxx 的回复:]
给一张表

1 = 1
2 = 2
3 = 2 + 1
4 = 2 + 2
5 = 5
6 = 5 + 1
7 = 5 + 2
8 = 5 + 2 + 1
9 = 5 + 2 + 2

十位数同理

不可能有百位数吧
[/Quote]

如果是这样,那要找99块,岂不是要建立从1到99个数的表呀。
那好像效率比较慢
Longinc 2008-10-24
  • 打赏
  • 举报
回复
面值很少,建一张表还是很方便的
langhua0001 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luansxx 的回复:]
给一张表

1 = 1
2 = 2
3 = 2 + 1
4 = 2 + 2
5 = 5
6 = 5 + 1
7 = 5 + 2
8 = 5 + 2 + 1
9 = 5 + 2 + 2

十位数同理

不可能有百位数吧
[/Quote]

强烈支持
Fighting Horse 2008-10-24
  • 打赏
  • 举报
回复
给一张表

1 = 1
2 = 2
3 = 2 + 1
4 = 2 + 2
5 = 5
6 = 5 + 1
7 = 5 + 2
8 = 5 + 2 + 1
9 = 5 + 2 + 2

十位数同理

不可能有百位数吧

65,210

社区成员

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

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