Skip to content

Instantly share code, notes, and snippets.

@zhangolve
Last active August 3, 2016 03:52
Show Gist options
  • Save zhangolve/8feb21a5008d1c0c6bbf9fc232016f85 to your computer and use it in GitHub Desktop.
Save zhangolve/8feb21a5008d1c0c6bbf9fc232016f85 to your computer and use it in GitHub Desktop.
function checkCashRegister(price, cash, cid) {
//fix the bug
function accAdd(arg1, arg2) {
var r1, r2, m, c;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", "")) * cm;
} else {
arg1 = Number(arg1.toString().replace(".", "")) * cm;
arg2 = Number(arg2.toString().replace(".", ""));
}
} else {
arg1 = Number(arg1.toString().replace(".", ""));
arg2 = Number(arg2.toString().replace(".", ""));
}
return (arg1 + arg2) / m;
}
function accSub(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
}
catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
}
catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
//fix the bug end
//define the type with numbe
cid[0][0]=0.01;
cid[1][0]=0.05;
cid[2][0]=0.1;
cid[3][0]=0.25;
cid[4][0]=1;
cid[5][0]=5;
cid[6][0]=10;
cid[7][0]=20;
cid[8][0]=100;
// define end
var change;
// Here is your change, ma'am.
change=cash-price;
var sum=0; //cid all cash
//check if there is no cash to change
for(var i=0;i<cid.length;i++)
{
sum=accAdd(sum,cid[i][1]);
}
//changeRes start
//以需找零96.74为例,经过第一次i=1找到60元,剩余36.74,i=2时,36.74-20=16.74,i=3的时候,cid[3][1]==55是大于change的,这个时候要凑出来一个数额,在这里是3×5.所以要用else,这个时候就是16.74-15=1.74,i=4,1.74-1=0.74,i=5,0.74-0.5=0.24,i=6 0.24-0.1*2=0.04,i=7这一步很关键,这里就是空的,在数组中增加0,当i=8时0.04=
function changeRes(change,cid)
{
var finalArr=[]; //define the return array
var resArr=[];//最终的二维数组
var oldChange=change; //把他固定住,方便以后比较
for(var i=8;i>-1;i--)
{
if(change-cid[i][1]>0)//change >type exampe change 70 cid[i][1] 40
{
finalArr.push(cid[i][1]);
change=accSub(change,cid[i][1]); //这就是新的找零了
}
else{
if(cid[i][0]>change) //单张面值就比change大,则没有对应的钱币来找
{
finalArr.push(0);
}
else{
for(var j=0;j<100;j++){
if((j*cid[i][0]<change||change==cid[i][0]*j)&&(j+1)*cid[i][0]>change )//找出来那个数字
{
finalArr.push(cid[i][0]*(j));
change=accSub(change,cid[i][0]*(j));
break;
}
}
}
}
}
var sum=finalArr.reduce(function(a,b){
return accAdd(a,b);
});
if(sum==oldChange) //最初的change
{
//构造一个新的二维数组
var numberArr=["ONE HUNDRED","TWENTY","TEN","FIVE","ONE","QUARTER","DIME","NICKEL","PENNY"];
for(var k=0;k<finalArr.length;k++)
{
if(finalArr[k]!==0)
{
resArr.push([numberArr[k],finalArr[k]]);
}
}
return resArr;
}
else{
return "Insufficient Funds";
}
}
//changeRes end
//obviously Insufficient Funds condition
if(sum-change<0)
{
return "Insufficient Funds";
}
else{
//equals condition
if(sum==change)
{
return 'Closed';
}
// maybe can change condition
else if(sum>change)
{
//add a function
return changeRes(change,cid);
}
}
//else end
}
checkCashRegister(3.26, 100.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]]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment