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

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

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

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

思路:

1.remainder表示剩余要找的钱,arr里放需要的零钱数组,value表示总共要找的钱的总值。这里要分清value总值和total总值。

2.用循环计算出数组里的钱,用total来表示零钱总值,要明白cid[i][1]存放的是该零钱的价值,就很好理解了,第一层循环条件同时保证该零钱有值,且找到满足要找钱的最大数组的值。

3.在循环中因为从大到小,就只要考虑,c表示可以找的最大零钱的个数,如果要找的钱大于了当前已有最大数组的值,则相减后,把当前数组放入arr[j]并让j自加,如果小于,就减掉当前数组最多能减掉的值并把将当前零钱的价值写给数组,最后把它赋给arr[j]。因为减法运算可能会造成浮点不准确,所以要每次循环都添加toFixed保留两位小数。

4.最后把判断return的语句添上,要注意第二个判断必须是!=,不能用!==,有可能remainder为0.00的情况,而这种情况也不能用parseInt去取正。

let checkCashRegister = (price, cash, cid) => {
  let remainder = cash - price,arr = [],j = 0,total = 0 ,value = remainder;
  const array = [0.01,0.05,0.1,0.25,1,5,10,20,100];
  for(let i = cid.length - 1;i >= 0;i--){
    total += cid[i][1];
    if(remainder > array[i] && cid[i][1] > 0){
      let c = parseInt(remainder / array[i]);
      if(remainder > cid[i][1]){
        remainder -= cid[i][1];
      }else{
        remainder -= c * array[i];
        cid[i][1] = c * array[i];
      }
      remainder = remainder.toFixed(2);
      arr[j++] = cid[i];
    }
  }
  if(total === value){
    return "Closed";
  }else if(total < value || remainder != 0){
    return "Insufficient Funds";
  }
  return arr;
};
console.log(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]])); //[["QUARTER", 0.5]]

  

  

如果有不明白的地方请留言,如果有更好更简便更优化的方法请留言,谢谢。

更多内容请访问我的个人博客:Bblog

最新文章

  1. allegro - 层叠相关参数
  2. 对IEnumerable&lt;T&gt;和IQueryable&lt;T&gt;的一点见解
  3. 更改动软代码生成器模板 验证Model数据合法性
  4. 【Hadoop】Hive HSQ 使用 &amp;&amp; 自定义HQL函数
  5. C# DateTime类型和时间戳 互相转换
  6. 20160130.CCPP体系详解(0009天)
  7. 20160512关于mac安装caffe的记录
  8. WPF事件,路由事件
  9. 抛弃vue-resource拥抱axios
  10. DAY2-MySQL专业安装
  11. .NET Core下的Spring Cloud&mdash;&mdash;前言和概述
  12. python4 分支结构,循环结构 for循环
  13. python中class的序列化和反序列化
  14. 完整的一次 HTTP 请求响应过程(二)
  15. MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx: Unknown command &#39;\Z&#39;.
  16. IIS下使用 HTTP/2
  17. PS添加透明立体水印
  18. c# Type.InvokeMember用法
  19. Oracle官方文档
  20. 大道至简的C语言内存管理

热门文章

  1. Windows【端口被占用,杀死想啥的端口】
  2. Python Django-入门到进阶
  3. 基于用户的协同过滤电影推荐user-CF python
  4. bzoj 3998
  5. git clone下载代码
  6. Gradle安装步骤
  7. SpringBoot的自动配置
  8. 自己动手造拖拉机轮子系列 -(react-loadable)
  9. ASP.NET Core微服务 on K8S学习笔记(第一章:详解基本对象及服务发现)
  10. 开发中常用的JS知识点集锦