欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Leecode刷题C语言之设计一个ATM机器

Leecode刷题C语言之设计一个ATM机器

2025/2/25 13:50:51 来源:https://blog.csdn.net/babyiu5201314/article/details/144951400  浏览:    关键词:Leecode刷题C语言之设计一个ATM机器

执行结果:通过

执行用时和内存消耗如下:

 

 

typedef struct {long long two_ty;long long five_ty;long long one_han;long long two_han;long long five_han;
} ATM;ATM* aTMCreate() {ATM *obj = (ATM *)malloc(sizeof(ATM));obj->two_ty = 0;obj->five_ty = 0;obj->one_han = 0;obj->two_han = 0;obj->five_han = 0;return obj;
}void aTMDeposit(ATM* obj, int* banknotesCount, int banknotesCountSize) {obj->two_ty += banknotesCount[0];obj->five_ty += banknotesCount[1];obj->one_han += banknotesCount[2];obj->two_han += banknotesCount[3];obj->five_han += banknotesCount[4];//print_atm(obj);
}void atm_sub(ATM* obj, ATM* cur) {obj->two_ty -= cur->two_ty;obj->five_ty -= cur->five_ty;obj->one_han -= cur->one_han;obj->two_han -= cur->two_han;obj->five_han -= cur->five_han;
}void print_atm(ATM *obj) {printf("%d %d %d %d %d\n", obj->two_ty, obj->five_ty, obj->one_han, obj->two_han, obj->five_han);
}int *cal(ATM* obj, int amount, int *res, int *retSize)
{*retSize = 5;ATM *cur = aTMCreate();if (amount >= 500) {if (amount / 500 > obj->five_han) {cur->five_han = obj->five_han;amount -= obj->five_han * 500;} else {cur->five_han = amount / 500;amount %= 500;}if (amount == 0) {res[4] = cur->five_han;atm_sub(obj, cur);free(cur);return res;}}res[4] = cur->five_han;if (amount >= 200) {if (amount / 200 > obj->two_han) {cur->two_han = obj->two_han;amount -= obj->two_han * 200;} else {cur->two_han = amount / 200;amount %= 200;}if (amount == 0) {res[3] = cur->two_han;atm_sub(obj, cur);free(cur);return res;}}res[3] = cur->two_han;if (amount >= 100) {if (amount / 100 > obj->one_han) {cur->one_han = obj->one_han;amount -= obj->one_han * 100;} else {cur->one_han = amount / 100;amount %= 100;}if (amount == 0) {res[2] = cur->one_han;atm_sub(obj, cur);free(cur);return res;}}res[2] = cur->one_han;if (amount >= 50) {if (amount / 50 > obj->five_ty) {cur->five_ty = obj->five_ty;amount -= obj->five_ty * 50;} else {cur->five_ty = amount / 50;amount %= 50;}if (amount == 0) {res[1] = cur->five_ty;atm_sub(obj, cur);free(cur);return res;}}res[1] = cur->five_ty;if (amount >= 20) {if (amount / 20 > obj->two_ty) {cur->two_ty = obj->two_ty;amount -= obj->two_ty * 20;} else {cur->two_ty = amount / 20;amount %= 20;}if (amount == 0) {res[0] = cur->two_ty;atm_sub(obj, cur);free(cur);return res;}}free(cur);if (amount != 0) {res[0] = -1;*retSize = 1;return res;}return res;
}int* aTMWithdraw(ATM* obj, int amount, int* retSize) {int *res = (int *)malloc(sizeof(int) * 5);memset(res, 0, sizeof(int) * 5);return cal(obj, amount, res, retSize);
}void aTMFree(ATM* obj) {free(obj);
}

解题思路:

  1. 定义ATM结构体
    • 使用typedef struct定义了一个名为ATM的结构体,包含五种面额的钞票数量:20元(two_ty)、50元(five_ty)、100元(one_han)、200元(two_han)、500元(five_han)。
  2. 创建ATM实例
    • aTMCreate函数通过malloc分配内存并初始化一个ATM实例,所有钞票数量初始化为0,然后返回这个实例的指针。
  3. 存款功能
    • aTMDeposit函数接受一个ATM实例的指针和一个包含五种面额钞票数量的整数数组(以及数组的大小),然后将这些数量加到ATM实例的对应字段上。
  4. 取款功能
    • cal函数是取款功能的核心,它接受一个ATM实例的指针、取款金额amount、一个用于存储结果的整数数组res以及一个指向结果数组大小的指针retSize
    • 函数首先创建一个临时的ATM实例cur用于计算取款所需的钞票数量。
    • 然后,按照面额从大到小的顺序(500元、200元、100元、50元、20元),检查ATM中是否有足够的钞票来满足取款需求。
    • 如果有足够的钞票,则从ATM中减去相应的数量,并将结果存储在res数组中。
    • 如果在任何一步中,取款金额被完全满足,函数会提前返回结果。
    • 如果最终取款金额没有被完全满足(即amount不为0),则将res[0]设置为-1,并将retSize设置为1,表示取款失败。
    • 最后,释放cur的内存。
  5. 取款接口
    • aTMWithdraw函数是取款功能的接口,它接受一个ATM实例的指针和取款金额amount,以及一个指向结果数组大小的指针retSize
    • 函数内部调用cal函数来处理取款逻辑,并返回结果数组。
  6. 打印ATM状态
    • print_atm函数接受一个ATM实例的指针,并打印出ATM中各种面额钞票的数量。
  7. 释放ATM实例
    • aTMFree函数接受一个ATM实例的指针,并释放其内存。
  8. 辅助函数
    • atm_sub函数用于从一个ATM实例中减去另一个ATM实例的钞票数量,主要用于取款逻辑中更新ATM状态。

整体而言,这段代码通过模拟ATM的存款和取款功能,展示了如何使用结构体、动态内存分配、数组以及基本的控制结构(如条件判断和循环)来实现一个简单的金融系统。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词