设计一个收银程序 checkCashRegister()
,其把购买价格(price
)作为第一个参数 , 付款金额 (cash
)作为第二个参数, 和收银机中零钱 (cid
) 作为第三个参数,cid
是一个二维数组,存着当前可用的找零.当收银机中的钱不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed"
.否者, 返回应找回的零钱列表,且由大到小存在二维数组中.
function checkCashRegister(price, cash, cid) {
var change=cash-price;
var s=0;
for(let i=0;i<cid.length;i+=1){
s+=cid[i][1];
}
if(s==change){
return "Closed"
} else if(s>change){
cid=cid.reverse();
var arr=addx(cid);
var ax=[];
var sx=change;//emmm有点多余
for(let j=0;j<arr.length;j++){//循环输出每一种零钱的数目
if(sx>=arr[j][2]){//判断使用哪种零钱,从100到0.01
for(let k=arr[j][1]/arr[j][2];k>=0;k-=1){//循环计算出每种零钱得付出多少张
if(sx-k*arr[j][2]>-0.0001){//此处由于精度问题不可以以0作为标准,浮点数精度问题
//大于0时候,可以继续往下运算,对剩余需要找的钱sx更改,并添加已经找的零钱进入
//输出数组里面
ax.push([arr[j][0],k*arr[j][2]]);
sx-=k*arr[j][2];
// console.log(sx);
k=-1;//脱离内层循环
}
}
}
}
if(sx<=0.0001){//精度问题
return ax;
}else{
return "Insufficient Funds";
}
}
// Here is your change, ma'am.
return "Insufficient Funds";
}
/* 算法由来
if(sx>=100){
for(let k=arr[0][1]/arr[0][2];k>=0;k-=1){
if(sx-k*arr[0][2]>0){
ax.push(["ONE HUNDRED",k*arr[0][2]]);
sx-=k*arr[0][2];
k=-1;
}
}
}
if(sx>=20){
for(let k=arr[1][1]/arr[1][2];k>=0;k-=1){
if(sx-k*arr[1][2]>0){
ax.push(["TWENTY",k*arr[1][2]]);
sx-=k*arr[1][2];
k=-1;
}
}
}
*/
function addx(arr){
//函数操作数组,增加子数组第三项,钱币面额以便计算
for(let i=0;i<arr.length;i+=1){
switch (arr[i][0]) {
case 'ONE HUNDRED':
arr[i].push(100);
break;
case 'TWENTY':
arr[i].push(20);
break;
case 'TEN':
arr[i].push(10);
break;
case 'FIVE':
arr[i].push(5);
break;
case 'ONE':
arr[i].push(1);
break;
case 'QUARTER':
arr[i].push(0.25);
break;
case 'DIME':
arr[i].push(0.1);
break;
case 'NICKEL':
arr[i].push(0.05);
break;
case 'PENNY':
arr[i].push(0.01);
break;
default:
break;
}
}
return arr;
}
// 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(3.26, 100.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]]);