如何在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
相关产品推荐
相关产品推荐

