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

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

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

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

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

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

思路是先计算应该找零的钱和收银机剩余的钱做比较(先不考虑收银机里面值大的问题),如果不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed",够找零时依次算出应该找零的面值列表,最后验证是否有面值大的问题,过程中把找零的钱数乘了100,我也不想这样的,但是js计算浮点运算会导致数值不准确,例如

0.1+0.2
//0.30000000000000004

  这是计算机存储数值时进制转换引起的问题,这里不多讨论。因为浮点数不是精确的值,所以就用整数计算了

function checkCashRegister(price, cash, cid) {
if(typeof price!=='number'||typeof cash!=='number') return false;
var change=cash*100-price*100;
var changeList=[];
var sum=0,i,j,check=0;
var int,dot,h,t,e,f,o,q,d,n,p;
for(i=0;i<cid.length;i++){
sum+=cid[i][1]*100;
} // 收银机余额
if(sum<change){
return "Insufficient Funds";
} //不够找零
else if(sum===change){
return "Closed";
} //正好
else{
dot=getDot(change);
h=realityNum(parseInt(change/10000),cid[8][1]/100);
if(h>0){
changeList.push(["ONE HUNDRED", h*100]);
}
t=realityNum(parseInt((change-h*10000)/2000),cid[7][1]/20);
if(t>0){
changeList.push(["TWENTY", t*20]);
}
e=realityNum(parseInt((change-h*10000-t*2000)/1000),cid[6][1]/10);
if(e>0){
changeList.push(["TEN", e*10]);
}
f=realityNum(parseInt((change-h*10000-t*2000-e*1000)/500),cid[5][1]/5);
if(f>0){
changeList.push(["FIVE", f*5]);
}
o=realityNum(parseInt((change-h*10000-t*2000-e*1000-f*500)/100),cid[4][1]);
if(o>0){
changeList.push(["ONE", o]);
}
q=realityNum(parseInt(dot/25),cid[3][1]*100/25);
if(q>0){
changeList.push(["QUARTER", q*0.25]);
}
d=realityNum(parseInt((dot-q*25)/10),cid[2][1]*100/10);
if(d>0){
changeList.push(["DIME", d*0.1]);
}
n=realityNum(parseInt((dot-q*25-d*10)/5),cid[1][1]*100/5);
if(n>0){
changeList.push(["NICKEL", n*0.05]);
}
p=realityNum(parseInt(dot-q*25-d*10-n*5),cid[0][1]*100);
if(p>0){
changeList.push(["PENNY", p*0.01]);
}
for(j=0;j<changeList.length;j++){
check+=changeList[j][1]*100;
}
if(check==change){
return changeList;
} //验证是否因面额大不够找零的问题
else{
return "Insufficient Funds";
}
}
}
function realityNum(p,n){
if(p<=n){
return p;
}
else{
return n;
}
} //实际需要找零的面值数
function getDot(num){
return Number((num).toString().split('')[(num).toString().split('').length-2])*10+Number((num).toString().split('')[(num).toString().split('').length-1]);
} //取数字的十位和个位数组成一个两位数字

 方法二:

function checkCashRegister(price, cash, cid) {
var change = cash-price;
var exchange = {
'PENNY':0.01,
'NICKEL':0.05,
'DIME':0.1,
'QUARTER':0.25,
'ONE':,
'FIVE':,
'TEN':,
'TWENTY':,
'ONE HUNDRED':,
};
var flag;
var ext = [];
var copy = [];
cid.reverse().forEach(item=>{
var key = item[];
var val = item[];
var cont = [];
copy.push([key,val]);
cont[] = ;
exchange[key] = Math.round(exchange[key]*);
change = Math.round(change*);
item[]= Math.round(item[]*);
while(change>=exchange[key]&&item[]>){
change = change - exchange[key];
item[] = item[] - exchange[key];
cont[] += exchange[key];
}
change/= ;
if(cont[]){
cont[] = key;
cont[] /= ;
ext.push(cont);
}
})
if(change!==){
return {status: "INSUFFICIENT_FUNDS", change: []};
}else{
flag = cid.every(item=>{
return item[]===;
})
if(flag){
return {status: "CLOSED", change: copy.reverse()}
}
else{
return {status: "OPEN", change: ext}
}
}
}

  

Exact Change的更多相关文章

  1. Exact Change(背包HDU2753)

    Exact Change Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. FCC高级编程篇之Exact Change

    Exact Change Design a cash register drawer function checkCashRegister() that accepts purchase price ...

  3. Exact Change(01背包)

    描述 Seller: That will be fourteen dollars. Buyer: Here's a twenty. Seller: Sorry, I don't have any ch ...

  4. [Advanced Algorithm] - Exact Change

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

  5. Exact Change FreeCodeCamp

    function checkCashRegister(price, cash, cid) { var change; var sumCid = 0; // Here is your change, m ...

  6. UVA-11517 Exact Change(DP)

    题目大意:有n张钞票,面值可能不同.你要买一件东西,可能需要找零钱.问最少付多少钱,并求出最少的钞票张数. 题目分析:定义状态dp(i,w)表示前i张钞票凑成w元需要的最少钞票张数.则状态转移方程为d ...

  7. FCC(ES6写法) Exact Change

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

  8. Codeforces Round #598 (Div. 3) A. Payment Without Change 水题

    A. Payment Without Change You have a coins of value n and b coins of value 1. You always pay in exac ...

  9. CF1256A Payment Without Change

    CF1256A Payment Without Change 洛谷评测传送门 题目描述 You have aa coins of value nn and bb coins of value 11 . ...

随机推荐

  1. Java基础知识陷阱(七)

    本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0. ...

  2. es6函数模块-------初步学习

    初步学习: 函数参数允许尾逗号 function clownsEverywhere( param1, param2, //param2后面有逗号 ) { } 函数参数可以赋初值 利用解构赋值默认值结合 ...

  3. java的接口为什么不能实例化

    java的接口为什么不能实例化呢?首先,我们需要明白实例化的含义.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s ...

  4. ServletContext获取多个servlet公共参数

    web.xml: <context-param> <param-name>context-param</param-name> <param-value> ...

  5. oracle中自定义type、以及java中传递list到过程中的例子

    在java开发过程中有时候为了处理数据的速度更快,会把要处理的数据组装成list,把list作为过程的一个参数,在过程中批量处理,下面就以一个例子做简单的阐述,以此谨记. --药品目录智能审核 --说 ...

  6. c# c++通信--命名管道通信

    进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...

  7. C++DFS方法全排列

    前几天看纪磊的<啊哈!算法>一书,里面讲算法讲的特别通俗细致,真的是初中生都能读得懂的算法书(我大二才读:P).这段代码很适合初学算法的同学. #include<iostream&g ...

  8. Java中private、protected、public和default的区别-001

    public: 具有最大的访问权限,可以访问任何一个在classpath下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. protected: 主要的作用就是用来保护子 ...

  9. openwrt设置uboot环境变量在flash上的存储地址

    1.分析如下 ubootenv_add_app_config ubootenv_add_uci_config "/dev/mtd1" "0x40000" &qu ...

  10. db2 xml 转 table

    版本:DB2 Version 9.1 1.创建测试表,初始化数据 create table emp (doc XML); INSERT INTO EMP VALUES ('<dept bldg= ...