当前位置: 首页 > article >正文

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


http://www.kler.cn/a/468510.html

相关文章:

  • 前后端环境配置java/vue/maven/node.js/mysql
  • 【练习】PAT 乙 1022 D进制的A+B
  • 【C++】构造函数与析构函数
  • js -音频变音(听不出说话的人是谁)
  • 基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真
  • OpenCV的TickMeter计时类
  • Gitee上传项目代码教程(详细)
  • MySQL中表之间关联不同方式操作详解
  • Spring Boot 的自动配置,以rabbitmq为例,请详细说明
  • 凸包(convex hull)简述
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环语句)
  • 20241231在Ubuntu20.04.5系统中下载安装Android Studio 2024.2.1.12
  • Kafka 消费者专题
  • 如何通过本地部署的DIFY辅助学习算法(PS可以辅助帮你学习任何想学习的资料)
  • 探索WebAssembly:前端与后端的新未来
  • unity学习6:unity的3D项目的基本界面和菜单
  • MCP(Model Context Protocol)模型上下文协议 进阶篇3 - 传输
  • 互动为王:开源AI智能名片链动2+1模式商城小程序在社群运营中的深度应用与价值探索
  • 解锁AI Agent潜能:智能时代的信息处理利器2(18/30)
  • ES-深度分页问题
  • LeetCode题练习与总结:随机翻转矩阵--519
  • 使用FDBatchMove的几个问题总结
  • 数据结构:ArrayList与顺序表
  • 每日一学——日志管理工具(Graylog)
  • C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)
  • 主从复制(Redis的特性)