设计一个 ATM 机器-C语言链表法

一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。

取款时,机器会优先取 较大 数额的钱。

比方说,你想取 $300 ,并且机器里有 2 张 $50 的钞票,1 张 $100 的钞票和1 张 $200 的钞票,那么机器会取出 $100 和 $200 的钞票。
但是,如果你想取 $600 ,机器里有 3 张 $200 的钞票和1 张 $500 的钞票,那么取款请求会被拒绝,因为机器会先取出 $500 的钞票,然后无法取出剩余的 $100 。注意,因为有 $500 钞票的存在,机器 不能 取 $200 的钞票。

请你实现 ATM 类:

ATM() 初始化 ATM 对象。
void deposit(int[] banknotesCount) 分别存入 $20 ,$50,$100,$200 和 $500 钞票的数目。
int[] withdraw(int amount) 返回一个长度为 5 的数组,分别表示 $20 ,$50,$100 ,$200 和 $500 钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回 [-1] (这种情况下 不 取出任何钞票)。

示例 1:

输入:
[“ATM”, “deposit”, “withdraw”, “deposit”, “withdraw”, “withdraw”]
[[], [[0,0,1,2,1]], [600], [[0,1,0,1,1]], [600], [550]]
输出:
[null, null, [0,0,1,0,1], null, [-1], [0,1,0,0,1]]

解释:
ATM atm = new ATM();
atm.deposit([0,0,1,2,1]); // 存入 1 张 $100 ,2 张 $200 和 1 张 $500 的钞票。
atm.withdraw(600); // 返回 [0,0,1,0,1] 。机器返回 1 张 $100 和 1 张 $500 的钞票。机器里剩余钞票的数量为 [0,0,0,2,0] 。
atm.deposit([0,1,0,1,1]); // 存入 1 张 $50 ,1 张 $200 和 1 张 $500 的钞票。
// 机器中剩余钞票数量为 [0,1,0,3,1] 。
atm.withdraw(600); // 返回 [-1] 。机器会尝试取出 $500 的钞票,然后无法得到剩余的 $100 ,所以取款请求会被拒绝。
// 由于请求被拒绝,机器中钞票的数量不会发生改变。
atm.withdraw(550); // 返回 [0,1,0,0,1] ,机器会返回 1 张 $50 的钞票和 1 张 $500 的钞票。

给出两种做法:

typedef struct {
    int money;
    struct ATM *next;


} ATM;


ATM* aTMCreate() {
    ATM *a=(ATM*)malloc(sizeof(ATM));
    int i;
    ATM *p;
    a->money=0;
    
    a->next=NULL;

     for(i=0;i<4;i++){
        p=(ATM*)malloc(sizeof(ATM));
        p->money=0;
        p->next=a->next;
        a->next=p;
    }
    return a;

}

void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {
    ATM *p=obj;
    int i,j;
    for(i=0;i<banknotesCountSize;i++){
       p->money=p->money+banknotesCount[i];
       printf("%d ",p->money);
       p=p->next;
    }

}

int* aTMWithdraw(ATM* obj, int amount, int* retSize) {
    int po;
     ATM *p=obj;
    int a[5];
    int i;
    int a_mo[5]={20,50,100,200,500};

   for(i=0;i<5;i++){
      a[i]=p->money;
       p=p->next;
    }
    po=4;
    while(po>=0&&amount!=0){
        if(a[po]==0){
            po--;
            continue;

        }
        if(a[po]!=0){
            if(a_mo[po]<=amount){
                a[po]--;
                amount=amount-a_mo[po];
            }
            else{
                po--;
            }

        }
        if(po<0) break;

    }
    if(amount==0){
        p=obj;
        for(i=0;i<5;i++){
         p->money=a[i]; 
          p=p->next;
          }
    }
     else return -1;
    return -1;


}


void aTMFree(ATM* obj) {

}

/**
 * Your ATM struct will be instantiated and called as such:
 * ATM* obj = aTMCreate();
 * aTMDeposit(obj, banknotesCount, banknotesCountSize);
 
 * int* param_2 = aTMWithdraw(obj, amount, retSize);
 
 * aTMFree(obj);
*/
typedef struct {
    long long money[5];
   // struct ATM *next;


} ATM;


ATM* aTMCreate() {
    ATM *a=(ATM*)malloc(sizeof(ATM));
    int i;
     for(i=0;i<5;i++){
      a->money[i]=0;
    }
    return a;

}

void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {
    ATM *p=obj;
    int i,j;
    for(i=0;i<banknotesCountSize;i++){
       p->money[i]=p->money[i]+banknotesCount[i];
    //   printf("%d ",p->money[i]);
     
    }

}

int* aTMWithdraw(ATM* obj, int amount, int* retSize) {
    int po;
     ATM *p=obj;
    long long* a = (long long*)malloc(sizeof(long long) * 5);
     int* b = ( int*)malloc(sizeof( int) * 5);
    int i;
    int a_mo[5]={20,50,100,200,500};
   
   for(i=0;i<5;i++){
      a[i]=p->money[i];
      b[i]=0;
    }
    po=4;
    while(po>=0&&amount!=0){
        if(a[po]==0){
            po--;
            continue;

        }
        if(a[po]!=0){
            //printf("%d %d --",a[po],po);
            if(a_mo[po]<=amount){
                long long n=amount/a_mo[po];
            //      printf("n1 %d %d  %d  %d ",a[po],n,amount,a_mo[po]);
                if(n>=a[po]){
              
                     amount=amount-a_mo[po]*a[po];
                   //   printf("amonunt  %d ",amount);
                       b[po]=a[po];
                       a[po]=0;
                //       printf("b[po] po %d %d ",b[po],po);

                }
                else {
                  //   printf("n2 %d %d ",a[po],n);

                    amount=amount-a_mo[po]*n;
                    // printf("amonunt  %d ",amount);
                     a[po]=a[po]-n;
                      b[po]=n+b[po];
                    //  po--;

                }
              
               
               
            }
            else{
                po--;
            }

        }
        if(po<0) break;

    }
 for(i=0;i<5;i++){
         
        printf("--%d ",b[i]);
          }

    if(amount==0){
      
        for(i=0;i<5;i++){
         p->money[i]=a[i]; 
     
          }
     *retSize=5;
        return b;
    }
     else {
         b[0]=-1;
         *retSize=1;
         return b;

     }
  //  return -1;


}


void aTMFree(ATM* obj) {

}

/**
 * Your ATM struct will be instantiated and called as such:
 * ATM* obj = aTMCreate();
 * aTMDeposit(obj, banknotesCount, banknotesCountSize);
 
 * int* param_2 = aTMWithdraw(obj, amount, retSize);
 
 * aTMFree(obj);
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值