设计一个收银程序 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. JavaScript:学习笔记(8)——对象扩展运算符

    JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...

  2. 基于Python操作redis介绍

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 毕业前的最后一个学期(2016.03),龙哥结婚了.可是总有些人喜欢嘲笑别人,调侃我.当时我就理直气壮的告诉他们,等龙哥孩子 ...

  3. 20145316许心远《Java学习笔记》第三周总结

    20145316许心远<Java程序设计>第3周学习总结 教材学习内容总结 一.定义类: 类定义时使用class关键字 如果要将x绑定到新建的对象上,可以使用"="制定 ...

  4. Linux中Qt的安装

    1.下载Ot安装包 Qt5.30的下载地址如下,在网页中打开找到需要的资源,下载.run格式的安装软件. http://download.qt.io/archive/qt/5.3/5.3.0/qt-o ...

  5. opencv图像处理之在手机上实现背景虚化

    http://m.blog.csdn.net/blogercn/article/details/75004162 1.高端数码相机都具有背景虚化功能.背景虚化就是使景深变浅,使焦点聚集在主题上.一般的 ...

  6. imx6q android 添加开机启动脚本

    1.在xx/out/target/product/sabresd_6dq/root/init.rc中添加以下内容 ========================================== ...

  7. 20145216史婧瑶《Java程序设计》第8周学习总结

    20145216 <Java程序设计>第8周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 java.util.logging 包提供了日志功能相关类与接口,不必额外配置 ...

  8. wechat4j获取用户昵称乱码修复

    项目对接微信公众号平台时,微信的官方给出的建议是使用wechat4j.官方建议的,自然心里踏实,但实际用起来时发现wechat4j埋有很多雷,最让人心烦意乱的就是中文乱码问题. 之前写过一篇为JAXB ...

  9. Win7旗舰版中的IIS配置asp.net 完美通过版,附代码 以及出现的 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\8d57d

    先解决问题:“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\8d57d 图: 其他的解决方案 ...

  10. shell统计各省的百强县

    原始数据在最后 baiqiang.txt文件中 shell命令: cat baiqiang.txt | grep -P "^国|^☆" | awk -F" " ...