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; }
修正说明
- 把
float换成double来存储金额,减少精度丢失;转整数时加0.5做四舍五入,确保分币转换准确。 - 用除法计算每种硬币的最大数量,取余得到剩余金额,逻辑简单直接,避免了嵌套循环的错误。
- 修复了镍币循环的减数值错误,现在会正确计算5美分硬币的数量。
- 优化了输入逻辑,当用户输入负数时给出提示,体验更好。
内容的提问来源于stack exchange,提问作者rustybandit
相关产品推荐
相关产品推荐

