思路:
本题同问题D及问题F类似,尽可能地按面额从大到小找钱即可解决。
解答:
/*
《算法笔记》codeup 100000584 问题 G: 找零钱
*/
#include <cstdio>
using namespace std;
int main() {
int amount; // 总额
int denomination[5] = {50, 20, 10, 5, 1}; // 面额
while (scanf("%d", &amount) != EOF) {
for (int i = 0; i <= 4; i++) {
if (amount < denomination[i]) // 跳到比总额小的面额
{
continue;
}
int num = amount / denomination[i]; // 计算总额包含多少张当前选中的面额
int balance = amount % denomination[i]; // 计算余额
if (num > 0) // 如果张数不为0,则
{
printf("%d*%d", denomination[i], num); // 输出
amount = balance; // 置下一次需要计算的金额为余额
}
else // 如果张数为0,则
{
break; // 结束
}
if (amount > 0) // 如果下一次需要计算的金额不为0,则
{
printf("+"); // 输出一个+
}
}
printf("\n");
}
return 0;
}