コード例 #1
0
 public int getNominalAmount(BILL_TYPE billType)
 {
     return(mMoneyStore[billType].getAmount());
 }
コード例 #2
0
 public int getMaxAmount(BILL_TYPE billType)
 {
     return(mMoneyStore[billType].getMaxAmount());
 }
コード例 #3
0
        public bool tryToGiveAwayMoney(int requesteSum, BILL_TYPE preferedType, ref string outMessage, out Dictionary <BILL_TYPE, int> outputSum)
        {
            outputSum = new Dictionary <BILL_TYPE, int> {
                { BILL_TYPE.TYPE_10, 0 },
                { BILL_TYPE.TYPE_50, 0 },
                { BILL_TYPE.TYPE_100, 0 },
                { BILL_TYPE.TYPE_500, 0 }
            };
            if (requesteSum == 0)
            {
                outMessage = "Requested sum is zero";
                return(false);
            }
            if (requesteSum > getMoneySum())
            {
                outMessage = "Requested sum is not available";
                return(false);
            }

            int sumNeeded = requesteSum;

            int sumByPrefered = mMoneyStore[preferedType].getMoneySum();
            int sumByOthers   = 0;

            if (sumByPrefered >= sumNeeded)
            {
                sumByOthers = sumNeeded - (int)preferedType * (sumNeeded / (int)preferedType);
                if (sumByOthers == 0)
                {
                    outputSum[preferedType] = sumNeeded / (int)preferedType;
                    sumNeeded = 0;
                }
            }
            else
            {
                sumByOthers = sumNeeded - sumByPrefered;
            }

            int                   sumByPrevBills = 0;
            int                   maxBillAmount  = 0;
            BILL_TYPE             maxBillType    = BILL_TYPE.TYPE_10;
            SortedSet <BILL_TYPE> mBillsList     = new SortedSet <BILL_TYPE>();

            mBillsList.Add(preferedType);
            if (sumByOthers != 0)
            {
                foreach (var curPair in mMoneyStore)
                {
                    if (curPair.Key == preferedType)
                    {
                        continue;
                    }

                    if (sumByOthers > (mMoneyStore[curPair.Key].getMoneySum() + sumByPrevBills))
                    {
                        sumByPrevBills += mMoneyStore[curPair.Key].getMoneySum();
                        mBillsList.Add(curPair.Key);
                    }
                    else
                    {
                        int curBillAmount = sumByOthers / (int)curPair.Key;
                        int curResid      = sumByOthers % (int)curPair.Key;
                        if (curResid != 0 && curResid > sumByPrevBills)
                        {
                            curBillAmount += 1;
                        }
                        maxBillAmount = curBillAmount;
                        maxBillType   = curPair.Key;
                        break;
                    }
                }
                if ((int)maxBillType * maxBillAmount <= requesteSum)
                {
                    sumNeeded  = requesteSum;
                    sumNeeded -= maxBillAmount * (int)maxBillType;
                    outputSum[maxBillType] = maxBillAmount;
                    foreach (var curType in mBillsList.Reverse())
                    {
                        int curBillsNeeded    = sumNeeded / (int)curType;
                        int curBillsAvailable = mMoneyStore[curType].getAmount();
                        int billSpended       = 0;
                        if (curBillsNeeded >= curBillsAvailable)
                        {
                            billSpended = curBillsAvailable;
                        }
                        else
                        {
                            billSpended = curBillsNeeded;
                        }
                        sumNeeded         -= billSpended * (int)curType;
                        outputSum[curType] = billSpended;
                    }
                }
            }


            if (sumNeeded == 0)
            {
                foreach (var curPair in outputSum)
                {
                    mMoneyStore[curPair.Key].tryDecrAmount(curPair.Value);
                }
            }
            else
            {
                outputSum.Clear();
                outMessage = "Could not return such sum";
                return(false);
            }

            outMessage = "Take your money";

            if (MoneyChangedEvent != null)
            {
                MoneyChangedEvent();
            }

            return(true);
        }