問題
這個(gè)題目要求編寫一段程序?qū)崿F(xiàn)統(tǒng)一銀座超市的找零方案游沿。只需輸入要補(bǔ)給顧客的 金額拾碌,然后通過程序就可以計(jì)算出該金額可由哪些面額的人民幣組成卦绣。
思路
人民的面額總共有(第五套)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
實(shí)現(xiàn)
package com.company;
import java.math.BigDecimal;
public class Solution {
/**
* 用貪心算法實(shí)現(xiàn)找零問題
* @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;
}
}