Exact Change(FCC高级算法)

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

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

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

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

 

重点:

  两位小数的减法运算会出错(用谷歌调试的时候发现的),所以我把所有数值都扩大了100倍计算

function checkCashRegister(price, cash, cid) {
  var nums = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1]; 
  var num = cash*100 - price*100;
  cid = cid.reverse();
  var arr = new Array();
  for(i=0; i<10 ;i++){
    arr[i] = new Array();
  }
  var j = 0;
  var sum = 0;
  var bool = false;
  nums.forEach( function(element, index) {
    // statements
        sum=0;
        while(num >= element){
          //下面这段代码时为了加快计算的
          var cid1 = cid[index][1]*100;
          if( cid1>= element){
            if(num >= cid1){
              num -= cid1;
              sum +=cid1;
              cid[index][1] -= cid1/100;
            }else {
              num -= element;
              sum +=element;
              cid[index][1] -= element/100;
            }
         bool = true;
         arr[j][0] = cid[index][0];
         arr[j][1] = sum/100;
      } else {
        break;
      }
    }
    if(bool){
          j++;
          bool = false;
        }
  });
  //删除掉多余的数组项
  for (var i = 0; i < arr.length; i++) {
    if(arr[i] == ""){
      arr.splice(i,1);
      i--;
    }
  }
  // 计算结束如果num还是>0则表示钱不够找0
  if(num > 0)return "Insufficient Funds";
  //在num=0的基础上  如果钱柜所有钱都找零用完了   
  if( cid.every(function(a,b,c){
      return a[1] === 0;
  })) return "Closed";
  //在钱柜还有钱  num0 的基础上  返回找零出去的信息
  return arr;
}

 

转载于:https://www.cnblogs.com/Leon-Huang-everyone/p/ExactChange-FCC-hht.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值