Exact Change
Posted 鲁小肃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]); } //取数字的十位和个位数组成一个两位数字
以上是关于Exact Change的主要内容,如果未能解决你的问题,请参考以下文章