FCC 算法 Exact Change

7 篇文章 0 订阅

这个任务挺有趣的,贴近生活

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

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

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

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

当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。

这是一些对你有帮助的资源:

下面是代码:

function checkCashRegister(price, cash, cid) {
  var change = [],same = cid;
  var minus = cash-price,sum=0;
  //创建money对象
  var money = {
    "PENNY"      :0.01,
    "NICKEL"     :0.05,
    "DIME"       :0.10,
    "QUARTER"    :0.25,
    "ONE"        :1,
    "FIVE"       :5,
    "TEN"        :10,
    "TWENTY"     :20,
    "ONE HUNDRED":100
  };
  for(var i=0;i<cid.length;i++){
    sum += cid[i][1];//求得收银机余额总数
  }
  if(minus>sum){//如果要找的零钱大于收银机余额
    return "Insufficient Funds" ;
  }else if(minus==sum){//如果要找的零钱等于收银机余额
    return "Closed";
  }else{
    var arr = Object.entries(money);//获得money对象的键值对数组
    var j=arr.length-1;
    for(;j>=0;j--){
      if(minus>arr[j][1]){
        if(minus>cid[j][1]){
          var restSum=0;
          for(var k=j;k>=0;k--){//计算收银机小钱余额总数
            restSum += cid[j][1];
          }
          if(restSum<minus){//如果收银机小钱余额总数小于要找的零钱
            return "Insufficient Funds";
          }else{
            change.push(cid[j]);
            minus = minus- cid[j][1];
          }
        }else if(minus == cid[j][1]){
          change.push(cid[j]);
          return change;
        }else{
          var chu = Math.floor(minus/arr[j][1]);//向下取整
          same[j][1] = arr[j][1]*chu;
          change.push(same[j]);
          if(minus==same[j][1]){
            return change;
          }else{
            minus = (minus-arr[j][1]*chu).toFixed(2);//保留两位小数
          }
        }
      }
    }
  }
  return change;
}

// 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]]);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值