收银系统算法

本文介绍了一个收银程序的设计实现,该程序可以根据购买价格、付款金额及收银机中零钱情况,判断是否能够完成找零,并返回相应的结果。具体包括处理不足找零的情况、精确找零情况以及完全匹配找零的情况。

设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.


cid 是一个二维数组,存着当前可用的找零.

当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed".

否者, 返回应找回的零钱列表,且由大到小存在二维数组中.

// 贪心 greedy

function checkCashRegister(price, cash, cid) {
    var change = [];
    // Here is your change, ma'am.
    var cidDic = {
        "ONE HUNDRED": {val: 100.00},
        "TWENTY": {val: 20.00},
        "TEN": {val: 10.00},
        "FIVE": {val: 5.00},
        "ONE": {val: 1.00},
        "QUARTER": {val: 0.25},
        "DIME": {val: 0.10},
        "NICKEL": {val: 0.05},
        "PENNY": {val: 0.01},
    };
    
    for(var i = 0; i < cid.length; i++) {
        cidDic[cid[i][0]].num = (cid[i][1] * 1e3) / (cidDic[cid[i][0]].val * 1e3);  // 修正js浮点数计算误差
    }
    
    var diff = cash - price;
    
    for(var key in cidDic) {
        var total = 0;
        while(diff >= cidDic[key].val && cidDic[key].num > 0) {
            cidDic[key].num--;
            total++;
            diff = (diff * 1e3 - cidDic[key].val * 1e3) / 1e3;
            if(cidDic[key].num === 0 || diff < cidDic[key].val) {
                change.push([key, total * (cidDic[key].val)]);
                break;
            }
        }
    }
    if (diff === 0) {
        for (var key in cidDic) {
            if (cidDic[key].num !== 0) {
                return change;
            }
        }
        return "Closed";
    } else {
        return "Insufficient Funds";
    }
}
// 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]])  // [["TWENTY",60],["TEN",20],["FIVE",15],["ONE",1],["QUARTER",0.5],["DIME",0.2],["PENNY",0.04]]

 

转载于:https://www.cnblogs.com/angle-qqs/p/8253879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值