问题描述:要求编写一个程序实现超市的找零方案,只需要输入要找给顾客的金额,然后通过程序可以计算出该金额可以由哪些面额的人民币组成。
算法分析:人民币有100、50、20、10、5、1、0.5、0.2、0.1等多种面额组成(元),比如找零68.90元,至少有以下三种方案:
- 1张50、1张10、一张5、3张1、1张0.5、4张0.1
- 2张20、2张10、一张5、3张1、1张0.5、4张0.1
- 6张10,、1张5、3张1、1栈更、4张0.1
具体实现代码如下:
#include<stdio.h>
#define MAXN 9
int parvalue[MAXN] = {10000,5000,2000,1000,500,100,50,10};//8种面值的货币乘以100
int num[MAXN] = {0};//储存找零各面值的张数
int exchange(int n); //找零函数声明
int main(){
int i;
float change;//找零
printf("请输入需要找零的金额:");
scanf_s("%f",&change);//输入找零金额
exchange((int)change*100);//找零乘以100并转化为整型
printf("找零%.2f元的组成为:\n",change);
for (i = 0;i<MAXN;i++){//找零面值组成输出
if (num[i]>0)//如果面值张数大于0,则输出
printf("%6.2f,%d张\n",(float)parvalue[i]/100.0,num[i]);//面值除以100.0输出
}
getchar();
return 0;
}
int exchange(int n){//找零函数
int i, j;
for (i = 0;i<MAXN;i++){
if (n>parvalue[i])break;//如果找到比最小面值的货币还小的数
while (n>0&&i<MAXN){//从最大面值的货币开始比较
if (n>=parvalue[i]){
n -= parvalue[i];
num[i]++;//储存减去的货币面值的数组加1
}
else if (n >= 5 && n < 10){//如果找零还剩0.1元至0.05元之间,按0.1元找零
num[MAXN-1]++;
break;//结束循环
}
else i++;
}
return 0;
}
}
运行结果如下: