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

循环与变量问题:零食兑换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)验证:

  1. current_pack=8,兑换2份,bonus=2,更新后current_pack=2+8%3=4
  2. current_pack=4,兑换1份,bonus=3,更新后current_pack=1+4%3=2
  3. 循环结束,总零食数8+3=11,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:33:03