Exact Change (FCC)
阿新 • • 發佈:2019-01-30
思路見註釋:
設計一個收銀程式 checkCashRegister()
,其把購買價格(price
)作為第一個引數 , 付款金額 (cash
)作為第二個引數, 和收銀機中零錢 (cid
) 作為第三個引數.
cid
是一個二維陣列,存著當前可用的找零.
當收銀機中的錢不夠找零時返回字串 "Insufficient Funds"
. 如果正好則返回字串 "Closed"
.
function checkCashRegister(price, cash, cid) { //應找回的金額 var change; //匹配對應幣值 var payarr=[ 0.01, 0.05, 0.1, 0.25, 1.0, 5.0, 10.0, 20.0, 100.0 ]; //初始化 var payobj={ "PENNY":0, "NICKEL":0, "DIME":0, "QUARTER":0, "ONE":0, "FIVE":0, "TEN":0, "TWENTY":0, "ONE HUNDRED":0 }; //獲取幣種種類 var i=payarr.length-1; //初始化 change=cash-price; var out=[]; var flag; var sum=0; //獲取陣列中指定列所有數和 function money(arr,id){ var i=0; arr.forEach(function(val){ i+=val[id]; }); return i; } //支付函式 function checke(change,i){ // console.log(change,i,payarr[i]); if(change>=payarr[i]&&cid[i][1]>0&&i>=0){ change=(change-payarr[i]).toFixed(2);//每次計算後保留兩位小數位,防止丟失 //支付後cid的餘額應該減少 cid[i][1]-=payarr[i]; payobj[cid[i][0]]+=payarr[i]; checke(change,i);//減完之後再次判斷是否能用當前幣值的貨幣退錢 }else if(change<payarr[i]&&i>0||cid[i][1]==0&&i>0){/*當前幣種大於應找餘額時切換至更低的幣種*/ checke(change,i-1);//切換至更低幣值 } else return;//無法切換時退出 } var l=change-money(cid,1);//應找錢與當前所剩錢的差值 checke(change,i); console.log(payobj); Object.keys(payobj).forEach(function(key){ if(payobj[key]>0){var arr1=[key,payobj[key]]; out.unshift(arr1);//佇列壓入陣列 sum+=payobj[key];//保留支出金額數目 } }); if(l==0)return "Closed";//如果支出的錢等於cid剩餘錢就返回“Closed” else if(l>0||sum<change)return "Insufficient Funds";//如果cid錢不夠,返回“Insufficient //Funds” else return out;//其他情況輸出找出的幣值及其金額 } // 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]]);
.toFixed(d)保留D位小數,浮點數計算時會丟失精度