You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写自动售货机C程序遇Returning change algorithim实现难题求助

嘿,这个找零逻辑确实容易卡壳,尤其是要兼顾硬币库存和指定格式的输出要求。我之前做过类似的自动售货机模拟程序,给你分享个可行的思路,应该能解决你的问题。

核心思路梳理

首先得明确两个核心需求:

  1. 精准计算找零组合,优先用大面额硬币,大面额耗尽时用小面额凑
  2. 跟踪硬币库存变化,输出时明确告知哪些硬币已耗尽、哪些被使用了

特别提醒:别用浮点数处理金额!比如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;
}

关键细节说明

  1. 整数金额处理:所有金额转成分,彻底避免浮点精度问题,这是货币计算的通用技巧。
  2. 找零逻辑:从大面额到小面额遍历,优先使用库存充足的大面额,库存不足时自动用小面额凑,完美解决你提到的“是否用3枚0.5硬币”的判断问题(比如找零1.5元且1元耗尽时,会自动用3枚0.5元)。
  3. 状态跟踪:通过used_count记录本次找零用了多少硬币,stock跟踪剩余库存,输出时就能精准展示哪些硬币耗尽、哪些被使用。

你可以根据自己的需求扩展面额类型(比如添加0.1元、0.2元等),只需要修改COIN_TYPES和coins数组的初始化即可,核心逻辑不需要改动。

内容的提问来源于stack exchange,提问作者Libyachampion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:41:24