编写自动售货机C程序遇Returning change algorithim实现难题求助
嘿,这个找零逻辑确实容易卡壳,尤其是要兼顾硬币库存和指定格式的输出要求。我之前做过类似的自动售货机模拟程序,给你分享个可行的思路,应该能解决你的问题。
核心思路梳理
首先得明确两个核心需求:
- 精准计算找零组合,优先用大面额硬币,大面额耗尽时用小面额凑
- 跟踪硬币库存变化,输出时明确告知哪些硬币已耗尽、哪些被使用了
特别提醒:别用浮点数处理金额!比如0.1+0.2的浮点精度问题会让你头疼到崩溃,建议把所有金额转换成分(整数)来计算,比如1元=100分,0.5元=50分,彻底规避浮点误差。
代码实现示例
下面是一段简化的核心代码,你可以直接参考扩展:
#include <stdio.h> #include <stdbool.h> // 定义硬币类型数量,可根据实际面额扩展 #define COIN_TYPES 2 // 存储硬币的面额(分)、库存数量、本次找零使用量 typedef struct { int cents; int stock; int used_count; } Coin; // 初始化硬币库存:比如1元(100分)初始为0,0.5元(50分)初始为3 Coin coins[COIN_TYPES] = {{100, 0, 0}, {50, 3, 0}}; // 计算找零组合,返回是否能完成找零 bool calculate_change(int change_cents) { // 重置本次找零的使用记录 for (int i = 0; i < COIN_TYPES; i++) { coins[i].used_count = 0; } int remaining = change_cents; // 从大面额到小面额优先使用 for (int i = 0; i < COIN_TYPES; i++) { if (remaining <= 0) break; // 计算当前硬币最多能用多少枚 int max_use = remaining / coins[i].cents; max_use = (max_use > coins[i].stock) ? coins[i].stock : max_use; if (max_use > 0) { coins[i].used_count = max_use; coins[i].stock -= max_use; remaining -= max_use * coins[i].cents; } } // 剩余金额为0说明找零成功 return remaining == 0; } // 按照要求格式输出找零结果 void print_change_result(int original_change) { printf("Get your item! "); // 检查并输出已耗尽的硬币 bool has_empty = false; for (int i = 0; i < COIN_TYPES; i++) { if (coins[i].stock == 0 && coins[i].used_count > 0) { if (!has_empty) { printf("No %.2fs left! ", coins[i].cents / 100.0); has_empty = true; } } } // 输出本次使用的硬币 bool has_used = false; for (int i = 0; i < COIN_TYPES; i++) { if (coins[i].used_count > 0) { if (!has_used) { printf("%d, %.2f are used! ", coins[i].used_count, coins[i].cents / 100.0); has_used = true; } else { printf("%d, %.2f are used! ", coins[i].used_count, coins[i].cents / 100.0); } } } printf("Change: %.2f\n", original_change / 100.0); } int main() { // 模拟用户示例:投入2元(200分),选价格1元(100分)的商品 int input_money = 200; int item_price = 100; int change = input_money - item_price; if (calculate_change(change)) { print_change_result(change); } else { printf("Cannot give exact change!\n"); } return 0; }
关键细节说明
- 整数金额处理:所有金额转成分,彻底避免浮点精度问题,这是货币计算的通用技巧。
- 找零逻辑:从大面额到小面额遍历,优先使用库存充足的大面额,库存不足时自动用小面额凑,完美解决你提到的“是否用3枚0.5硬币”的判断问题(比如找零1.5元且1元耗尽时,会自动用3枚0.5元)。
- 状态跟踪:通过
used_count记录本次找零用了多少硬币,stock跟踪剩余库存,输出时就能精准展示哪些硬币耗尽、哪些被使用。
你可以根据自己的需求扩展面额类型(比如添加0.1元、0.2元等),只需要修改COIN_TYPES和coins数组的初始化即可,核心逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Libyachampion
相关产品推荐
相关产品推荐

