美文网首页
Exact Change - freecodecamp

Exact Change - freecodecamp

作者: 静候那一米阳光 | 来源:发表于2018-02-07 17:16 被阅读0次

Exact Change - freecodecamp

https://www.freecodecamp.org/challenges/exact-change

题目

Design a cash register drawer function checkCashRegister() that accepts purchase price as the first argument (price), payment as the second argument (cash), and cash-in-drawer (cid) as the third argument.

cid is a 2D array listing available currency.

Return the string "Insufficient Funds" if cash-in-drawer is less than the change due. Return the string "Closed" if cash-in-drawer is equal to the change due.

Otherwise, return change in coin and bills, sorted in highest to lowest order.

解析

简单来说这就是超市收银员找零的一个问题。

price-应付款,cash-实付款,然后给出找零的方案。

给出了抽屉里的零钱面值与对应的总金额。

然后从面值大的开始找,,,blablabla找下去。。。

如果钱不够/找不开,报错 "Insufficient Funds";
如果刚好找完,报 "Closed";
否则给出方案。

面值换算

"PENNY": 0.01 美元,
"NICKEL": 0.05 美元,
"DIME": 0.10 美元,
"QUARTER": 0.25 美元,
"ONE": 1.00 美元,
"FIVE": 5.00 美元,
"TEN": 10.00 美元,
"TWENTY": 20.00 美元,
"ONE HUNDRED": 100.00 美元.

实现

为了防止小数计算的问题,在实际操作中,以美分计。

function checkCashRegister(price, cash, cid) {
  var change = (cash - price) * 100;

  function pieces(rest, allValue, faceValue) {
    if (rest < faceValue) {
      return;
    } else {
      var p = 0;
      while (faceValue * p <= rest && faceValue * p <= allValue) {
        p++;
      }
      p--;
      return { total: faceValue * p, rest: rest - faceValue * p, page: p };
    }
  }

  var p = {
    "PENNY": 1,
    "NICKEL": 5,
    "DIME": 10,
    "QUARTER": 25,
    "ONE": 100,
    "FIVE": 500,
    "TEN": 1000,
    "TWENTY": 2000,
    "ONE HUNDRED": 10000
  };
  var sum = 0;
  var res = [];
  cid.forEach(function(x) {
    sum += x[1] * 100;
  });
  if (sum < change) {
    return "Insufficient Funds";
  } else if (sum == change) {
    return "Closed";
  } else {
    var rest = change;
    for (var i = cid.length - 1; i >= 0; i--) {
      var r = pieces(rest, cid[i][1] * 100, p[cid[i][0]]);
      if (r) {
        res.push([cid[i][0], parseFloat(r.total / 100, 2)]);
        rest = r.rest;
      }
    }
    if (rest == 0) {
      return res;
    } else {
      return "Insufficient Funds";
    }
  }
  // Here is your change, ma'am.
}


// 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(19.50, 20.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]]);

相关文章

  • Exact Change - freecodecamp

    Exact Change - freecodecamp https://www.freecodecamp.org/...

  • FreeCodeCamp筆記之:Exact Change

    题目 设计一个收银程序checkCashRegister(),其把购买价格(price)作为第一个参数 , 付款金...

  • Exact Change

    function checkCashRegister(price, cash, cid) { var chang...

  • Exact Change

    设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额...

  • Exact Change

    题目要求:设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 ,...

  • Exact Change

    设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额...

  • Exact Change

    要求 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付...

  • FCC高级编程篇之Exact Change

    Exact Change Design a cash register drawer function check...

  • 【21】预约变动

    delay 使延期 exact 确切的 fixed 确定的 postpone 延迟 change 更改 settl...

  • FCC 高级算法 Exact Change

    目标 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付...

网友评论

      本文标题:Exact Change - freecodecamp

      本文链接:https://www.haomeiwen.com/subject/uhjazxtx.html