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

如何在C语言中实现带不规则步长的循环优化找零贪心算法?

优化贪心找零算法中的重复代码

完全理解你对重复代码的困扰!你的思路方向是对的,但因为硬币面额是不规则的离散值(你原函数里用的是25、10、5、1,提到的15应该是笔误吧?),用for循环的步长控制确实不合适。这里有个更优雅的解决办法:把所有面额存到一个数组里,然后遍历数组处理每一种硬币。

修改后的代码

// 全局变量保持不变:change 和 numberCoins
int calculateNumber(void) {
    // 把所有硬币面额按从大到小的顺序存入数组
    int denominations[] = {25, 10, 5, 1};
    // 计算数组中面额的数量(避免硬写循环次数)
    int denomCount = sizeof(denominations) / sizeof(denominations[0]);

    // 遍历每个面额,执行统一的计算逻辑
    for (int i = 0; i < denomCount; i++) {
        int currentCoin = denominations[i];
        numberCoins += change / currentCoin;
        change = change % currentCoin;
    }
    return 0;
}

为什么这样更好?

  • 彻底消除重复代码:原来重复四次的逻辑现在只写一次,后续维护更简单。
  • 灵活性极强:如果以后需要调整面额(比如添加15分硬币,或者换成其他币种的面额),只需要修改denominations数组即可,不需要改动循环逻辑。
  • 可读性更高:数组清晰列出所有硬币面额,别人看代码一眼就能明白贪心算法的处理顺序。

关于你提到的“不规则步长循环”

其实对于这种离散的、无规律的取值,用数组存储后遍历是最常用也最合理的方案,比硬凑步长要直观得多。硬写步长不仅容易出错,还会让代码变得难以理解和维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:38:14