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的存款和取款功能,展示了如何使用结构体、动态内存分配、数组以及基本的控制结构(如条件判断和循环)来实现一个简单的金融系统。

相关推荐
学不思则罔5 分钟前
ParallelStream并发陷阱解析
java·开发语言·windows
认真的小羽❅8 分钟前
【Java并发编程】volatile关键字深度解析:从内存语义到实际应用
java·开发语言
jayson.h15 分钟前
可视化界面
开发语言·python
kgduu23 分钟前
python中的魔法方法
开发语言·python
fox_lht29 分钟前
12.3.使用生命周期使引用一直有用
开发语言·后端·rust
开发者联盟league31 分钟前
在cursor中配置c/c++开发环境
c语言·开发语言·c++
初圣魔门首席弟子32 分钟前
bug 2026.05.15(以前能运行的java springboot项目突然间不能运行后台数据了)
java·开发语言·bug
求知也求真佳33 分钟前
S19|MCP 与插件:多 Agent 平台 —— 外部能力总线,让外部工具安全接入
开发语言·agent
测试员周周38 分钟前
【Appium 系列】第07节-API测试封装 — BaseAPI 的设计与实现
开发语言·人工智能·功能测试·测试工具·appium·自动化·测试用例
『昊纸』℃39 分钟前
C语言简介
c语言·操作系统·编程语言·应用领域·历史发展