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

C++14火柴棍计数程序输出异常 变量重置问题排查

火柴棍计数程序输出错误排查

问题背景

实现程序统计每个测试用例中拼接数字消耗的火柴棍总数量,单数字对应火柴棍数量映射为:0:6、1:2、2:5、3:5、4:4、5:5、6:6、7:3、8:7、9:6。
程序无编译报错,但运行输出和预期不符,计数结果持续累加,看似计数变量sticks没有正确重置为0。

问题源码

#include <bits/stdc++.h>
using namespace std;

int main() {
    map<char,int> digits={
    {'0',6},{'1',2},{'2',5},{'3',5},{'4',4},{'5',5},{'6',6},{'7',3},{'8',7},{'9',6}
    };
    map<char,int> peterMap;
    int t; cin >> t;
    string peterNum[t];
    for(string &a:peterNum) cin >> a;
    for(string b:peterNum){
        int sticks = 0;
        string tomNum, n;
        for(char c:b) ++peterMap[c];
        for(auto d:peterMap) sticks += d.second*digits[d.first];
        cout << sticks << ' ';
    }
    return 0;
}

输入输出对比

  • 测试输入
5              (测试用例数量)
1 0 5 10 15 
  • 实际运行输出
2 8 13 21 28 
  • 题目预期输出
2 6 5 8 7

错误根因

sticks变量本身每次循环都正确初始化为0,不存在重置失败的问题,错误根源是字符计数容器peterMap的作用域错误:
peterMap定义在测试用例遍历循环的外部,处理每个测试用例时,仅往map里累加当前字符串的字符计数,从未清空上一个用例残留的计数数据。最终计算火柴棍总数时,会把之前所有测试用例的字符计数全部累加进去,导致结果持续变大。

额外说明:代码中string peterNum[t]是变长数组,属于GCC编译器的非标准扩展,不符合标准C++语法,建议替换为vector<string> peterNum(t),但这个写法不是本次输出错误的诱因。

修复方法

二选一即可:

  1. 将map<char,int> peterMap;的定义移动到测试用例遍历循环的内部,每次处理新用例时都会生成一个全新的空map,不会残留历史计数。
  2. 保留peterMap在循环外的定义,每次处理新测试用例的开头调用peterMap.clear()清空容器内容。

修复后核心循环代码参考:

for(string b:peterNum){
    int sticks = 0;
    map<char,int> peterMap; // 移到循环内,每次新建空map
    for(char c:b) ++peterMap[c];
    for(auto d:peterMap) sticks += d.second*digits[d.first];
    cout << sticks << ' ';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:51:25