Exact Change
设计一个收银程序 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的更多相关文章
- Exact Change(背包HDU2753)
Exact Change Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- FCC高级编程篇之Exact Change
Exact Change Design a cash register drawer function checkCashRegister() that accepts purchase price ...
- Exact Change(01背包)
描述 Seller: That will be fourteen dollars. Buyer: Here's a twenty. Seller: Sorry, I don't have any ch ...
- [Advanced Algorithm] - Exact Change
题目 设计一个收银程序 checkCashRegister(),其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. ci ...
- Exact Change FreeCodeCamp
function checkCashRegister(price, cash, cid) { var change; var sumCid = 0; // Here is your change, m ...
- UVA-11517 Exact Change(DP)
题目大意:有n张钞票,面值可能不同.你要买一件东西,可能需要找零钱.问最少付多少钱,并求出最少的钞票张数. 题目分析:定义状态dp(i,w)表示前i张钞票凑成w元需要的最少钞票张数.则状态转移方程为d ...
- FCC(ES6写法) Exact Change
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid ...
- 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 ...
- CF1256A Payment Without Change
CF1256A Payment Without Change 洛谷评测传送门 题目描述 You have aa coins of value nn and bb coins of value 11 . ...
随机推荐
- Jenkins--持续集成服务器
1.持续集成: 1.1概念 持续集成,Continuous integration ,简称CI. 集成:我们所有项目的代码都是托管在SVN服务器上.每个项目都要有若干个单元测试,并有一个所谓集成测试. ...
- Java并发编程:Lock(转)
本文转自:http://www.cnblogs.com/dolphin0520/p/3923167.html Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized ...
- Java并发编程:并发容器之ConcurrentHashMap(转)
本文转自:http://www.cnblogs.com/dolphin0520/p/3932905.html Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载 ...
- 在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示
在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示) 1.使用npm安装依赖 npm install --save codemirror; 2.在页面中放入如下代码 ...
- Python面试题之Python正则表达式re模块
一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...
- 20145307陈俊达《信息安全系统设计基础》第5周学习总结PT1
20145307陈俊达<信息安全系统设计基础>第5周学习总结 教材学习内容总结 X86寻址方式经历三代: DOS时代的平坦模式,不安全,原因是没有区分用户空间和内核空间 8086的分段模式 ...
- chrome调试工具
Chrome调试面板 Chrome 开发者工具是一套内置在Google Chrome中Web开发和调试工具.使用开发者工具来重演,调试和剖析您的网站.其中常用的有Elements(元素面板).Cons ...
- MR案例:WordCount改写
请参照wordcount实现一个自己的MapReduce,需求为: a. 输入文件格式: xxx,xxx,xxx,xxx,xxx,xxx,xxx b. 输出文件格式: ...
- 资源 | TensorFlow推出新工具Seedbank:即刻使用的预训练模型库【转】
本文转载自:http://tech.ifeng.com/a/20180713/45062331_0.shtml 选自TensorFlow 作者:Michael Tyka 机器之心编译 参与:路.王淑婷 ...
- CORE MVC 自定义认证
微软的认证体系,集成了EF,和它的表结构,对于我们已有的系统,或者想高度自定义的人,该怎么办呢? 答案在: https://docs.microsoft.com/en-us/aspnet/core/s ...