C++统计数组元素出现次数程序异常问题及修复求助
修复C++数组元素重复计数程序的问题
首先看你遇到的问题:你的程序想要统计数组中每个元素的出现次数,但输出重复显示了相同元素(比如两个5、两个2都各自输出了一次),而且计数结果不符合预期。咱们先拆解原程序里的问题,再给出修复方案。
原程序的核心问题
- 循环条件错误:在检查当前元素是否已经在前面出现过的循环里,
for(int k=0;k>i;k++)这个条件写反了,应该是k<i,否则这个循环根本不会执行,等于没做前面元素的重复检查。 - 未跳过已统计元素:原程序会遍历数组的每一个元素并输出计数,哪怕这个元素已经被统计过,所以会出现重复的输出项。
- 计数逻辑混乱:嵌套的多个循环里的判断逻辑绕了弯路,比如在else分支里的重置计数操作会干扰正确的统计结果。
修复方案1:修正原逻辑,实现去重统计
我们可以先检查当前元素是否已经被统计过,如果没统计过,再遍历整个数组计算它的出现次数,然后输出结果。这样就能避免重复输出,同时保证计数正确。
修复后的代码如下:
#include <iostream> using namespace std; int main() { int n; cout << "Enter Length of Elements= "; cin >> n; int arr[50]; // 输入数组元素 for(int i = 0; i < n; i++) { cout << "Enter Number="; cin >> arr[i]; } // 统计并输出每个元素的出现次数(去重) for(int i = 0; i < n; i++) { // 先检查当前元素是否已经被统计过 bool isCounted = false; for(int k = 0; k < i; k++) { if(arr[i] == arr[k]) { isCounted = true; break; } } if(isCounted) { continue; // 跳过已统计的元素 } // 统计当前元素的出现次数 int countNum = 0; for(int j = 0; j < n; j++) { if(arr[i] == arr[j]) { countNum++; } } cout << arr[i] << " has appeared " << countNum << " Times" << endl; } return 0; }
修复方案2:更简洁的高效方法(使用哈希表)
如果想要更高效的统计(尤其是数组元素较多时),可以用C++的unordered_map来实现,代码更简洁,时间复杂度更低:
#include <iostream> #include <unordered_map> using namespace std; int main() { int n; cout << "Enter Length of Elements= "; cin >> n; int arr[50]; unordered_map<int, int> countMap; // 输入元素同时统计次数 for(int i = 0; i < n; i++) { cout << "Enter Number="; cin >> arr[i]; countMap[arr[i]]++; } // 遍历哈希表输出结果 for(auto& pair : countMap) { cout << pair.first << " has appeared " << pair.second << " Times" << endl; } return 0; }
测试你给出的数组{5,2,3,2,5},两个修复后的程序都会输出:
5 has appeared 2 Times
2 has appeared 2 Times
3 has appeared 1 Times
这样就完全符合你的预期了。
内容的提问来源于stack exchange,提问作者Pro Boy
相关产品推荐
相关产品推荐

