设计一个收银程序 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} } } }