CPP_Basics_Syntax/第一讲 变量、输入输出、表达式与顺序语句/t658.cpp

50 lines
1.3 KiB
C++

// 读取一个带有两个小数位的浮点数,这代表货币价值。
// 在此之后,将该值分解为多种钞票与硬币的和,每种面值的钞票和硬币使用数量不限,要求使用的钞票和硬币的总数量尽可能少。
// 钞票的面值是 100,
// 50, 20, 10, 5, 2
// 。
// 硬币的面值是 1,
// 0.50, 0.25, 0.10, 0.05 和 0.01
// 。
// 经过实验证明:在本题中,优先使用面额大的钞票和硬币可以保证所用的钞票和硬币总数量最少。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
double n;
cin >> n;
int m = (int)(n * 100); // 保留两位小数
double a[12] = {10000, 5000, 2000, 1000, 500, 200,
100, 50, 25, 10, 5, 1};
int ans[12] = {0};
for (int i = 0; i < 12; i++)
{
int cnt = 0;
while (m >= a[i])
{
m -= a[i]; // 从大到小减
cnt++;
}
ans[i] = cnt; // 记录每种面值的钞票和硬币使用数量
}
puts("NOTAS:");
for (int i = 0; i < 6; i++)
printf("%d nota(s) de R$ %.2lf\n", ans[i], a[i] / 100);
puts("MOEDAS:");
for (int i = 6; i < 12; i++)
printf("%d moeda(s) de R$ %.2lf\n", ans[i], a[i] / 100);
return 0;
}