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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 16:24:03