问题
这个题目要求编写一段程序实现统一银座超市的找零方案。只需输入要补给顾客的 金额,然后通过程序就可以计算出该金额可由哪些面额的人民币组成。
思路
人民的面额总共有(第五套)100、50、20、10、5、1、0.5、0.1、0.05、0.02、0.01等11种面额,本问题依旧采用贪心算法思想来解决。即,先用大面额找零,大面额找不了,换更小的面额,直到找零完毕。
使用
package com.company;
public class Main {
public static void main(String[] args) {
// write your code here
Solution.gainCharge(503.94);
}
}
输出
100.0元 5张
1.0元 3张
0.5元 1张
0.1元 4张
0.02元 1张
0.01元 1张
Process finished with exit code 0
实现
package com.company;
import java.math.BigDecimal;
public class Solution {
/**
* 用贪心算法实现找零问题
* @param money
*/
static public void gainCharge(double money) {
final double[] denomination = {100,50,20,10,5,1,0.5,0.1,0.05,0.02,0.01};
if (!Solution.isValidateMoney(money)) {
System.out.println("这不是钱币金额!");
return;
}
double copiedMoney = money;
for (int counter = 0;counter < denomination.length;counter++) {
if (copiedMoney == 0)break;
if (denomination[counter] > copiedMoney)continue;
int moneyCounter = 0;
while (copiedMoney >= denomination[counter]) {
moneyCounter++;
copiedMoney -= denomination[counter];
}
System.out.println(denomination[counter] + "元 " + moneyCounter + "张");
}
}
/**
* 检查是否是人民币的金额
* @param money
* @return
*/
static private boolean isValidateMoney(double money) {
if (money < 0)return false;
double enlargedMoney = money * 100;
long longMoney = (long) enlargedMoney;
if (enlargedMoney - longMoney > 0)return false;
return true;
}
}