如何将C语言找零代码中的四个重复for循环合并为一个?
找零硬币计数代码去重实现方案
你当前的四组循环逻辑完全一致,仅每次扣减的硬币面额不同,通过数组存储面额+遍历的方式即可合并为一套逻辑,同时还可以优化逐枚扣减的冗余操作,提升运行效率。
修改后的完整代码如下:
#include <stdio.h> #include <cs50.h> #include <math.h> int main(void) { float dollars = 0; float real_value = 0; int cents = 0; int coin_counter = 0; // 定义硬币面额数组,按从大到小排序,后续新增/修改面额只需调整该数组即可 int denoms[] = {25, 10, 5, 1}; // 自动计算数组长度,调整面额数组时无需手动修改遍历次数 int denom_count = sizeof(denoms) / sizeof(denoms[0]); do { dollars = get_float("change owed: "); cents = round(dollars*100); } while(dollars<0); // 单循环遍历所有面额完成计数 for(int i = 0; i < denom_count; i++) { int current_denom = denoms[i]; // 直接计算当前面额最多可用数量,无需逐枚扣减 int coin_num = cents / current_denom; coin_counter += coin_num; cents -= coin_num * current_denom; } // 原循环中重复赋值real_value属于冗余操作,最终赋值一次即可 real_value = cents; printf("coins: %i\n",coin_counter); printf("leftovers: %f\n", real_value); return 0; }
如果出于学习需求要保留逐枚扣减的逻辑,只需修改遍历内的代码即可,外层仍然只需要一层循环:
for(int i = 0; i < denom_count; i++) { int current_denom = denoms[i]; while(cents >= current_denom) { cents -= current_denom; coin_counter++; real_value = cents; } }
优化后代码扩展性更强,后续如果要新增面额(比如20美分),只需要在denoms数组对应位置添加数值即可,不需要额外新增循环逻辑。
内容的提问来源于stack exchange,提问作者newbieZ
相关产品推荐
相关产品推荐

