CS50 Problem Set6找零硬币计算代码异常求助:每次输出0
问题排查与修正方案
你的代码输出始终为0,是因为多个逻辑错误和浮点数精度问题导致所有循环都未执行,下面逐个指出问题并给出修复方案:
1. 循环条件逻辑完全错误
所有while change % X >= X的条件永远不可能成立——取模运算的结果必然小于除数,比如change % 0.25的结果范围是[0, 0.25),不可能大于等于0.25,所以这些循环根本不会进入。应该直接判断change >= 硬币面值。
2. 硬币面值与计算错误
- dime(10分)部分:你写的是
change = change - 1,这是减了1美元而非10分,应该减0.1;还有变量名拼写错误coint应该是coin。 - nickel(5分)部分:你把面值写成了
0.5(50分),正确的nickel面值是0.05。 - pennies(1分)部分:循环条件误用了
0.1,应该判断change >= 0.01。
3. 浮点数精度隐患
用浮点数处理货币会有精度问题,比如0.1在二进制中是无限循环小数,累加或减操作后会出现类似0.009999999999999787的误差,导致循环判断失效。正确的做法是把金额转换为**整数(单位:分)**来计算。
修正后的代码
# ask the user for change owed from cs50 import get_float while True: change = get_float("Change owed:") if change > 0: break # 转换为整数(分),避免浮点数精度问题 cents = round(change * 100) coin = 0 # compute quarter (25分) while cents >= 25: cents -= 25 coin += 1 # compute dime (10分) while cents >= 10: cents -= 10 coin += 1 # compute nickel (5分) while cents >= 5: cents -= 5 coin += 1 # compute pennies (1分) while cents >= 1: cents -= 1 coin += 1 print(coin)
或者更高效的整除写法:
from cs50 import get_float while True: change = get_float("Change owed:") if change > 0: break cents = round(change * 100) coin = 0 coin += cents // 25 cents %= 25 coin += cents // 10 cents %= 10 coin += cents // 5 cents %= 5 coin += cents print(coin)
内容的提问来源于stack exchange,提问作者Balup
相关产品推荐
相关产品推荐

