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

C语言找零程序While循环存在计数超出预期的Bug

问题分析与修复方案

嘿,我帮你揪出代码里的几个关键问题啦,这就是为啥很多输入会高估硬币数量的原因:

  • 镍币计算的致命错误:你在处理5美分镍币的循环里,写的是n = n - 1而不是n = n - 5!这就导致每次遇到金额>=5的时候,程序会把它拆成1美分的便士来处理,自然硬币总数会凭空多出好几倍,这是最核心的问题。
  • 浮点数精度的坑:用float存储金额再乘以100转整数,很容易出现精度丢失。比如输入0.29,float可能会存成0.28999999,乘以100后变成28.999999,转成int就成了28,直接少了1美分,后续计算全错。
  • 多余的总数计算:最后输出总硬币数时你写了counter + n,但循环结束后n已经被减到0了,直接输出counter就对了。
  • 嵌套while循环的冗余:其实没必要嵌套这么多层while,直接用除法+取余计算每种硬币的数量,逻辑更简洁,还不容易出错。

修正后的代码

#include <stdio.h>

int main() {
    double cash;
    int n;
    int counter = 0;
    int quarters = 0;
    int dimes = 0;
    int nickels = 0;
    int pennies = 0;

    // 循环获取有效的正数输入
    for (;;) {
        printf("Enter change amount: ");
        scanf("%lf", &cash);
        if (cash > 0) {
            break;
        }
        printf("Please enter a positive number!\n");
    }

    // 处理浮点数精度问题,加0.5实现四舍五入转整数
    n = (int)(cash * 100 + 0.5);

    // 直接用除法和取余计算每种硬币的数量,高效又清晰
    quarters = n / 25;
    n = n % 25;
    dimes = n / 10;
    n = n % 10;
    nickels = n / 5;
    n = n % 5;
    pennies = n;

    // 统计总硬币数
    counter = quarters + dimes + nickels + pennies;

    // 输出结果
    printf("Total coins: %d\n", counter);
    printf("%i quarters, %i dimes, %i nickels, %i pennies\n", quarters, dimes, nickels, pennies);

    return 0;
}

修正说明

  1. 把float换成double来存储金额,减少精度丢失;转整数时加0.5做四舍五入,确保分币转换准确。
  2. 用除法计算每种硬币的最大数量,取余得到剩余金额,逻辑简单直接,避免了嵌套循环的错误。
  3. 修复了镍币循环的减数值错误,现在会正确计算5美分硬币的数量。
  4. 优化了输入逻辑,当用户输入负数时给出提示,体验更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:46