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),但这个写法不是本次输出错误的诱因。
修复方法
二选一即可:
- 将
map<char,int> peterMap;的定义移动到测试用例遍历循环的内部,每次处理新用例时都会生成一个全新的空map,不会残留历史计数。 - 保留
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
相关产品推荐
相关产品推荐

