设计一个收银程序checkCashRegister(),其把购买价格(price)作为第一个参数,付款金额 (cash)作为第二个参数,和收银机中零钱 (cid) 作为第三个参数。
cid是一个二维数组,存着当前可用的找零,如:
[
["PENNY", 1.01], //1分
["NICKEL", 2.05], //5分
["DIME", 3.10], //10分
["QUARTER", 4.25], //25分
["ONE", 90.00], //100分
["FIVE", 55.00], //500分
["TEN", 20.00], //1000分
["TWENTY", 60.00], //2000分
["ONE HUNDRED", 100.00] //10000分
]
当收银机中的钱不够找零时返回字符串 “Insufficient Funds”。
如果正好则返回字符串 “Closed”。
否则,返回应找回的零钱列表,且由大到小存在二维数组中。
function checkCashRegister(price, cash, cid) {
//全部变成以“分”为单位
price *= 100;
cash *= 100;
//计算应找数额
//用changeLeft记录每一轮找钱之后的剩余应找数额
var change = cash - price;
var changeLeft = change;
//定义结果数组
var result = [];
//获取收银机内总钱数(分)
function getCidTotal(cid){
var total = 0;
for(var i=0;i<cid.length;i++){
total += cid[i][1];
}
return total.toFixed(2)*100;
}
var cidTotal = getCidTotal(cid);
//如果应找数额大于收银机内总钱数,那明显钱不够找的
if(change > cidTotal){
return "Insufficient Funds";
}
//刚好相等的话,就肯定要“closed”了
else if(change === cidTotal){
return "Closed";
}
//创建一个对象,存放每种面额的单位(分)
var coinValueObj = {
"PENNY": 1,
"NICKEL": 5,
"DIME": 10,
"QUARTER": 25,
"ONE": 100,
"FIVE": 500,
"TEN": 1000,
"TWENTY": 2000,
"ONE HUNDRED": 10000
};
//一个个面额去检查够不够找
//从大面额往小面额循环,以此保证大面额能率先被用掉
for(var i=cid.length-1;i>=0;i--){
var coinName = cid[i][0]; //获取面额名称
var coinTotal = cid[i][1]*100; //获取该面额现有钱数(分)
var coinValue = coinValueObj[coinName]; //获取该面额的单位(分)
var coinAmount = coinTotal / coinValue; //获取该面额的单位数量
var toReturn = 0; //记录应该返回result的面额单位的数量
//如果应找数额大于等于该面额单位面值,同时该面额单位数量大于0的话,那就证明这个面额还有的找
while(changeLeft >= coinValue && coinAmount > 0){
changeLeft -= coinValue;
coinAmount--;
toReturn++;
}
//当应返回的面额单位数量大于0时,就可以把这个面额的名字和已经减掉的数额插进result数组内
if(toReturn > 0){
result.push([coinName,toReturn*coinValue/100]);
}
}
//如果最终result数组内的总钱数依然无法与应找数额配平,那就证明:尽管应找金额小于收银机内的总钱数,但有些面额是找不开的
//比如现在要找400分,可是你整个收银机里只有一个500分硬币,那么你也是无法找钱的,你总不能亏100分然后找出去吧?
if(getCidTotal(result)!==change){
return "Insufficient Funds";
}
//返回结果数组
return result;
}
THE END.









网友评论