Exact Change - freecodecamp
https://www.freecodecamp.org/challenges/exact-change
题目
Design a cash register drawer function checkCashRegister() that accepts purchase price as the first argument (price), payment as the second argument (cash), and cash-in-drawer (cid) as the third argument.
cid is a 2D array listing available currency.
Return the string "Insufficient Funds" if cash-in-drawer is less than the change due. Return the string "Closed" if cash-in-drawer is equal to the change due.
Otherwise, return change in coin and bills, sorted in highest to lowest order.
解析
简单来说这就是超市收银员找零的一个问题。
price-应付款,cash-实付款,然后给出找零的方案。
给出了抽屉里的零钱面值与对应的总金额。
然后从面值大的开始找,,,blablabla找下去。。。
如果钱不够/找不开,报错 "Insufficient Funds";
如果刚好找完,报 "Closed";
否则给出方案。
面值换算
"PENNY": 0.01 美元,
"NICKEL": 0.05 美元,
"DIME": 0.10 美元,
"QUARTER": 0.25 美元,
"ONE": 1.00 美元,
"FIVE": 5.00 美元,
"TEN": 10.00 美元,
"TWENTY": 20.00 美元,
"ONE HUNDRED": 100.00 美元.
实现
为了防止小数计算的问题,在实际操作中,以美分计。
function checkCashRegister(price, cash, cid) {
var change = (cash - price) * 100;
function pieces(rest, allValue, faceValue) {
if (rest < faceValue) {
return;
} else {
var p = 0;
while (faceValue * p <= rest && faceValue * p <= allValue) {
p++;
}
p--;
return { total: faceValue * p, rest: rest - faceValue * p, page: p };
}
}
var p = {
"PENNY": 1,
"NICKEL": 5,
"DIME": 10,
"QUARTER": 25,
"ONE": 100,
"FIVE": 500,
"TEN": 1000,
"TWENTY": 2000,
"ONE HUNDRED": 10000
};
var sum = 0;
var res = [];
cid.forEach(function(x) {
sum += x[1] * 100;
});
if (sum < change) {
return "Insufficient Funds";
} else if (sum == change) {
return "Closed";
} else {
var rest = change;
for (var i = cid.length - 1; i >= 0; i--) {
var r = pieces(rest, cid[i][1] * 100, p[cid[i][0]]);
if (r) {
res.push([cid[i][0], parseFloat(r.total / 100, 2)]);
rest = r.rest;
}
}
if (rest == 0) {
return res;
} else {
return "Insufficient Funds";
}
}
// Here is your change, ma'am.
}
// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);