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

相关推荐
炸膛坦客24 分钟前
嵌入式 - 数据结构与算法:(1-4)数据结构 - 单链表的两个核心缺点(引入循环/双向链表)
c语言·数据结构·链表
2501_9327502629 分钟前
Java IO流基础全面详解:字节流、字符流
java·开发语言
冰暮流星35 分钟前
javascript之默认事件
开发语言·javascript·ecmascript
fengci.38 分钟前
CTF+随机困难题目
android·开发语言·前端·学习·php
l1t41 分钟前
DeepSeek总结的Python 3.14.5 发布候选版本
开发语言·python
雪度娃娃1 小时前
设计模式——单例模式
开发语言·c++·设计模式
Cyber4K1 小时前
【Python专项】进阶语法-日志分类与分析(2)
开发语言·前端·python
lbb 小魔仙1 小时前
Python + LangChain 环境搭建完全指南:从零构建本地 RAG 知识库(附 Ollama 本地模型集成)
开发语言·python·langchain
风落无尘1 小时前
Python 包发布全流程:从项目结构到 PyPI 上线,以及我踩过的那些坑
开发语言·python·pip
xxjj998a1 小时前
PHP vs C#:两大编程语言终极对比
开发语言·c#·php