设计一个收银程序 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. 【android】activity的4种启动模式简介

    首先咱必须知道,activity是以栈(后进先出)的结构进行管理的. 当活动A启动了活动B时,A被压入到栈内,B在栈的最顶层.当B调用finish()结束活动时,B从栈弹出,此时A在栈的最顶层. 我们 ...

  2. laravel request 增加字段

    https://segmentfault.com/q/1010000006898668 $input = $request->only(['username', 'password']); // ...

  3. 【Python】错误、调试和测试

    链接到错误处理 链接到调试 链接到单元测试 链接到文档测试 [错误处理] 小结:遇到错误怎么办? 1.不理它. 2.捕获它,再抛出. 3.捕获并处理错误. raise 不懂如何处理错误就直接抛出(ra ...

  4. Spring事务用法示例与实现原理

    关于Java中的事务,简单来说,就是为了保证数据完整性而存在的一种工具,其主要有四大特性:原子性,一致性,隔离性和持久性.对于Spring事务,其最终还是在数据库层面实现的,而Spring只是以一种比 ...

  5. flume从log4j收集日志输出到kafka

    1. flume安装 (1)下载:wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.1.tar.gz (2)解压:ta ...

  6. pxe无人值守自动安装

    rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpmyum listyum upda ...

  7. 20145310 GDB调试汇编堆栈分析

    GDB调试汇编堆栈分析 由于老师说要逐条分析汇编代码,所以我学习卢肖明同学的方法,重新写了一篇博客. 代码: #include<stdio.h> short addend1 = 1; st ...

  8. 20145314郑凯杰 《Java程序设计》第5周学习总结

    20145314郑凯杰 <Java程序设计>第5周学习总结 教材学习内容总结 托管的代码: 电脑上的代码: try与catch 简单来说,try与catch是两个块,java的程序会把正常 ...

  9. 20145324 Java实验二

    实验1: 先建立.java 在建立test 测试正常情况 测试出错情况 错误 修改后的代码 正确 测试边界情况 100时出错 修改后的代码 测试 实验2: 先建test在写,java 实验3:建模 练 ...

  10. 20145329 《JAVA程序设计》实验三总结

    实验日期:2016.4.12 实验时间:15:30~17:30 实验序号:实验三 实验名称: 敏捷开发与XP实践 实验目的与要求: XP基础 XP核心实践 相关工具 实验内容 1.使用git托管代码 ...