Exact Change
设计一个收银程序 checkCashRegister()
,其把购买价格(price
)作为第一个参数 , 付款金额 (cash
)作为第二个参数, 和收银机中零钱 (cid
) 作为第三个参数.
cid
是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed"
.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。
这是一些对你有帮助的资源:
思路是先计算应该找零的钱和收银机剩余的钱做比较(先不考虑收银机里面值大的问题),如果不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed",够找零时依次算出应该找零的面值列表,最后验证是否有面值大的问题,过程中把找零的钱数乘了100,我也不想这样的,但是js计算浮点运算会导致数值不准确,例如
0.1+0.2 //0.30000000000000004
这是计算机存储数值时进制转换引起的问题,这里不多讨论。因为浮点数不是精确的值,所以就用整数计算了
function checkCashRegister(price, cash, cid) { if(typeof price!=='number'||typeof cash!=='number') return false; var change=cash*100-price*100; var changeList=[]; var sum=0,i,j,check=0; var int,dot,h,t,e,f,o,q,d,n,p; for(i=0;i<cid.length;i++){ sum+=cid[i][1]*100; } // 收银机余额 if(sum<change){ return "Insufficient Funds"; } //不够找零 else if(sum===change){ return "Closed"; } //正好 else{ dot=getDot(change); h=realityNum(parseInt(change/10000),cid[8][1]/100); if(h>0){ changeList.push(["ONE HUNDRED", h*100]); } t=realityNum(parseInt((change-h*10000)/2000),cid[7][1]/20); if(t>0){ changeList.push(["TWENTY", t*20]); } e=realityNum(parseInt((change-h*10000-t*2000)/1000),cid[6][1]/10); if(e>0){ changeList.push(["TEN", e*10]); } f=realityNum(parseInt((change-h*10000-t*2000-e*1000)/500),cid[5][1]/5); if(f>0){ changeList.push(["FIVE", f*5]); } o=realityNum(parseInt((change-h*10000-t*2000-e*1000-f*500)/100),cid[4][1]); if(o>0){ changeList.push(["ONE", o]); } q=realityNum(parseInt(dot/25),cid[3][1]*100/25); if(q>0){ changeList.push(["QUARTER", q*0.25]); } d=realityNum(parseInt((dot-q*25)/10),cid[2][1]*100/10); if(d>0){ changeList.push(["DIME", d*0.1]); } n=realityNum(parseInt((dot-q*25-d*10)/5),cid[1][1]*100/5); if(n>0){ changeList.push(["NICKEL", n*0.05]); } p=realityNum(parseInt(dot-q*25-d*10-n*5),cid[0][1]*100); if(p>0){ changeList.push(["PENNY", p*0.01]); } for(j=0;j<changeList.length;j++){ check+=changeList[j][1]*100; } if(check==change){ return changeList; } //验证是否因面额大不够找零的问题 else{ return "Insufficient Funds"; } } } function realityNum(p,n){ if(p<=n){ return p; } else{ return n; } } //实际需要找零的面值数 function getDot(num){ return Number((num).toString().split('')[(num).toString().split('').length-2])*10+Number((num).toString().split('')[(num).toString().split('').length-1]); } //取数字的十位和个位数组成一个两位数字
方法二:
function checkCashRegister(price, cash, cid) { var change = cash-price; var exchange = { 'PENNY':0.01, 'NICKEL':0.05, 'DIME':0.1, 'QUARTER':0.25, 'ONE':1, 'FIVE':5, 'TEN':10, 'TWENTY':20, 'ONE HUNDRED':100, }; var flag; var ext = []; var copy = []; cid.reverse().forEach(item=>{ var key = item[0]; var val = item[1]; var cont = []; copy.push([key,val]); cont[1] = 0; exchange[key] = Math.round(exchange[key]*100); change = Math.round(change*100); item[1]= Math.round(item[1]*100); while(change>=exchange[key]&&item[1]>0){ change = change - exchange[key]; item[1] = item[1] - exchange[key]; cont[1] += exchange[key]; } change/= 100; if(cont[1]){ cont[0] = key; cont[1] /= 100; ext.push(cont); } }) if(change!==0){ return {status: "INSUFFICIENT_FUNDS", change: []}; }else{ flag = cid.every(item=>{ return item[1]===0; }) if(flag){ return {status: "CLOSED", change: copy.reverse()} } else{ return {status: "OPEN", change: ext} } } }
人生如逆旅,我亦是行人