1. 程式人生 > >Exact Change (FCC)

Exact Change (FCC)

思路見註釋:

設計一個收銀程式 checkCashRegister() ,其把購買價格(price)作為第一個引數 , 付款金額 (cash)作為第二個引數, 和收銀機中零錢 (cid) 作為第三個引數.

cid 是一個二維陣列,存著當前可用的找零.

當收銀機中的錢不夠找零時返回字串 "Insufficient Funds". 如果正好則返回字串 "Closed".

function checkCashRegister(price, cash, cid) {
  //應找回的金額 
 var change;
   //匹配對應幣值
  var payarr=[
    0.01,
    0.05,
    0.1,
    0.25,
   1.0,
    5.0,
   10.0,
    20.0,
    100.0
  ];
//初始化
  var payobj={
    "PENNY":0,
    "NICKEL":0,
    "DIME":0,
    "QUARTER":0,
    "ONE":0,
    "FIVE":0,
    "TEN":0,
    "TWENTY":0,
    "ONE HUNDRED":0
  };
  //獲取幣種種類
  var i=payarr.length-1;
  //初始化
  change=cash-price;
  var out=[];
  var flag;
  var sum=0;
//獲取陣列中指定列所有數和
  function money(arr,id){
    var i=0;
    arr.forEach(function(val){
       i+=val[id];
    });
    return i;
  }
//支付函式
 function checke(change,i){
  // console.log(change,i,payarr[i]);
   if(change>=payarr[i]&&cid[i][1]>0&&i>=0){
     change=(change-payarr[i]).toFixed(2);//每次計算後保留兩位小數位,防止丟失
//支付後cid的餘額應該減少
    cid[i][1]-=payarr[i];
     
     payobj[cid[i][0]]+=payarr[i]; 
     checke(change,i);//減完之後再次判斷是否能用當前幣值的貨幣退錢
   }else if(change<payarr[i]&&i>0||cid[i][1]==0&&i>0){/*當前幣種大於應找餘額時切換至更低的幣種*/
     checke(change,i-1);//切換至更低幣值
}
   else return;//無法切換時退出
 }
  var l=change-money(cid,1);//應找錢與當前所剩錢的差值
 
checke(change,i);
  console.log(payobj);
  Object.keys(payobj).forEach(function(key){
   if(payobj[key]>0){var arr1=[key,payobj[key]];
                    out.unshift(arr1);//佇列壓入陣列
                     sum+=payobj[key];//保留支出金額數目
                    }
   
   });
  
 if(l==0)return "Closed";//如果支出的錢等於cid剩餘錢就返回“Closed”
  else if(l>0||sum<change)return "Insufficient Funds";//如果cid錢不夠,返回“Insufficient //Funds”
  else return out;//其他情況輸出找出的幣值及其金額
}

// Example cash-in-drawer array:
// [["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]]

checkCashRegister(19.50, 20.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]]);

.toFixed(d)保留D位小數,浮點數計算時會丟失精度