設計一個收銀程序 checkCashRegister()
,其把購買價格(price
)做爲第一個參數 , 付款金額 (cash
)做爲第二個參數, 和收銀機中零錢 (cid
) 做爲第三個參數.javascript
cid
是一個二維數組,存着當前可用的找零.java
當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds"
. 若是正好則返回字符串 "Closed"
.git
不然, 返回應找回的零錢列表,且由大到小存在二維數組中.github
思路:數組
1.remainder表示剩餘要找的錢,arr裏放須要的零錢數組,value表示總共要找的錢的總值。這裏要分清value總值和total總值。app
2.用循環計算出數組裏的錢,用total來表示零錢總值,要明白cid[i][1]存放的是該零錢的價值,就很好理解了,第一層循環條件同時保證該零錢有值,且找到知足要找錢的最大數組的值。優化
3.在循環中由於從大到小,就只要考慮,c表示能夠找的最大零錢的個數,若是要找的錢大於了當前已有最大數組的值,則相減後,把當前數組放入arr[j]並讓j自加,若是小於,就減掉當前數組最多能減掉的值並把將當前零錢的價值寫給數組,最後把它賦給arr[j]。由於減法運算可能會形成浮點不許確,因此要每次循環都添加toFixed保留兩位小數。設計
4.最後把判斷return的語句添上,要注意第二個判斷必須是!=,不能用!==,有可能remainder爲0.00的狀況,而這種狀況也不能用parseInt去取正。code
let checkCashRegister = (price, cash, cid) => { let remainder = cash - price,arr = [],j = 0,total = 0 ,value = remainder; const array = [0.01,0.05,0.1,0.25,1,5,10,20,100]; for(let i = cid.length - 1;i >= 0;i--){ total += cid[i][1]; if(remainder > array[i] && cid[i][1] > 0){ let c = parseInt(remainder / array[i]); if(remainder > cid[i][1]){ remainder -= cid[i][1]; }else{ remainder -= c * array[i]; cid[i][1] = c * array[i]; } remainder = remainder.toFixed(2); arr[j++] = cid[i]; } } if(total === value){ return "Closed"; }else if(total < value || remainder != 0){ return "Insufficient Funds"; } return arr; }; console.log(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.5]]
若是有不明白的地方請留言,若是有更好更簡便更優化的方法請留言,謝謝。blog
更多內容請訪問個人我的博客: Bblog