问题描述
在这个问题中,你需要读取一个整数值并将其分解为多张钞票的和,每种面值的钞票可以使用多张,并要求所用的钞票数量尽可能少。
请你输出读取值和钞票清单。
钞票的可能面值有 100,50,20,10,5,2,1
输入格式
输入一个整数 N
输出格式
参照输出样例,输出读取数值以及每种面值的钞票的需求数量。
输入格式
0<N<1000000
输入样例:
576
输出样例:
576
5 nota(s) de R$ 100,00
1 nota(s) de R$ 50,00
1 nota(s) de R$ 20,00
0 nota(s) de R$ 10,00
1 nota(s) de R$ 5,00
0 nota(s) de R$ 2,00
1 nota(s) de R$ 1,00
初级想法
代码如下(示例):
由于题目要求所用的钞票数量尽可能少,则利用贪心的思想先从大的钞票开始计算,然后减去大的钞票所占用金额,继续向后计算金额较小的钞票所需数量。思路简单但是书写相对麻烦
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,e,f,g,h;
cin>>h;
a=h/100;
b=(h-a*100)/50;
c=(h-a*100-b*50)/20;
d=(h-a*100-b*50-20*c)/10;
e=(h-a*100-b*50-20*c-10*d)/5;
f=(h-a*100-b*50-20*c-10*d-5*e)/2;
g=h-a*100-b*50-20*c-10*d-5*e-2*f;
printf("%d\n",h);
printf("%d nota(s) de R$ 100,00\n",a);
printf("%d nota(s) de R$ 50,00\n",b);
printf("%d nota(s) de R$ 20,00\n",c);
printf("%d nota(s) de R$ 10,00\n",d);
printf("%d nota(s) de R$ 5,00\n",e);
printf("%d nota(s) de R$ 2,00\n",f);
printf("%d nota(s) de R$ 1,00\n",g);
return 0;
}
加入数组和循环
将钞票面额按照从大到小的顺序存入数组中,依次计算
代码如下(示例):
#include<iostream>
using namespace std;
#include<cmath>
int main() {
int m, arr[7] = { 100,50,20,10,5,2,1 };
scanf("%d", &m);
printf("%d\n",m);
for (int i = 0; i < 7; i++) {
printf("%d nota(s) de R$ %d,00\n", m / arr[i], arr[i]);
m %= arr[i];
}
return 0;
}
总结
一个问题的求解通常有多种做法,简单问题亦是如此,需要多多考虑一种问题能不能有更好的做法。