循环与变量问题:零食兑换C程序逻辑错误排查及修复
零食兑换程序数值异常问题的原因与修复方案
我帮你分析下代码里的两个核心问题,正是它们导致了input出现随机大数的异常:
1. 未重置跨测试用例的变量
你在main函数开头定义了bonus变量,这个变量会在所有测试用例之间共享状态——上一个测试用例计算出的bonus值不会自动清零,会被带到下一个测试用例中继续累加。比如第一个测试用例跑完bonus=3,第二个测试用例开始时bonus还是3,直接参与后续计算,会导致奖励数被错误叠加,最终引发数值溢出,出现看起来像随机的大数。
2. input更新逻辑错误
你当前更新input的公式是:
input = bonus + (input-(k*(input/k)));
这里误用了累计的总奖励数bonus,但实际上每次兑换后,新的可兑换包装数应该是「本次兑换得到的奖励数」加上「本次兑换剩余的包装数」,而不是累计的所有奖励。这个错误会让input的计算完全偏离预期,甚至进入无限循环,让bonus不断累加直到溢出。
修复后的代码
我调整了变量作用域和更新逻辑,确保每个测试用例独立计算,同时修正了包装数的更新规则:
#include <stdio.h> int main() { int t, input, k; scanf("%d", &t); while(t--){ // 每个测试用例重新初始化变量,避免跨用例污染 scanf("%d", &input); scanf("%d", &k); int bonus = 0; int current_pack = input; // 跟踪当前可用于兑换的包装数 while(current_pack >= k){ int exchange = current_pack / k; // 本次能兑换的零食数 bonus += exchange; // 更新包装数:兑换的零食吃完变成exchange个包装 + 兑换后剩余的包装 current_pack = exchange + (current_pack % k); } int total = input + bonus; printf("%d\n", total); } return 0; }
修复逻辑说明
- 把
bonus移到测试用例循环内部,确保每个用例开始时bonus都是0,不会被之前的计算影响。 - 用
current_pack单独跟踪当前的包装数,每次兑换时只使用本次兑换得到的数量来更新,而不是累计的总奖励。 - 使用
current_pack % k替代input-(k*(input/k)),逻辑更简洁且等价。
用你给出的测试用例(初始8,k=3)验证:
current_pack=8,兑换2份,bonus=2,更新后current_pack=2+8%3=4current_pack=4,兑换1份,bonus=3,更新后current_pack=1+4%3=2- 循环结束,总零食数
8+3=11,符合预期。
内容的提问来源于stack exchange,提问作者Gary02
相关产品推荐
相关产品推荐

