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