w3c网站收银系统算法挑战

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮冬.

希望能有帮助,谢谢打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值