设计一个收银程序 checkCashRegister()
,其把购买价格(price
)做为第一个参数 , 付款金额 (cash
)做为第二个参数, 和收银机中零钱 (cid
) 做为第三个参数.数组
cid
是一个二维数组,存着当前可用的找零.测试
当收银机中的钱不够找零时返回字符串 "Insufficient Funds
". 若是正好则返回字符串 "Closed
".设计
不然, 返回应找回的零钱列表,且由大到小存在二维数组中.code
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]])
应该返回一个数组.checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
应该返回一个字符串.checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
应该返回一个字符串.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]])
应该返回 [["QUARTER", 0.50]]
.checkCashRegister(3.26, 100.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]])
应该返回 [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]]
.这个就是平时的自动找零机须要作的代码。主要是要构建现金面值数组,从大到小找零便可,具体分析见代码注释。ip
function checkCashRegister2(price, cash, cid) { // 1. 定义现金面值,经过 100 倍变换为整数,方便计算 var cashValMap = [ ["ONE HUNDRED", 10000], ["TWENTY", 2000], ["TEN", 1000], ["FIVE", 500], ["ONE", 100], ["QUARTER", 25], ["DIME", 10], ["NICKEL", 5], ["PENNY", 1] ]; // 2. 计算找零的总数 var change= Math.round((cash - price) * 100); // 3. 转换 cid 数组为对象,而且加入 total 表示零钱总数 var cidObject = cid.reduce(function(arr, cur) { arr[cur[0]] = Math.round(cur[1] * 100); arr.total += arr[cur[0]]; return arr; }, {total: 0}); // 4. 判断若是零钱总数和须要找零同样,则返回 closed if (cidObject.total == change) return "closed"; // 5. 判断若是零钱总数小于找零数目,则返回 Insufficient Funds if (cidObject.total < change) return "Insufficient Funds"; // 6. 从大到小遍历现金面值,比较零钱数,计算出合适的找零数目,返回找零数组 var retArr = cashValMap.reduce(function(acc, cur) { var tmp = Math.min(Math.floor(change / cur[1]) * cur[1], cidObject[cur[0]]); change -= tmp; if (tmp > 0) { acc.push([cur[0], parseFloat((tmp / 100).toFixed(2))]); } return acc; }, []); // 7. 判断是否零钱足够组合成须要的找零数 if (change !== 0) return "Insufficient Funds"; return retArr; }