C++ 投票统计:固定范围计数法实现及开发注意要点
好的,我们来一起解决这个问题。 ## 💡 问题理解 我们有 **10 位学生**,他们的编号是 1 到 10。每个学生只能投一票,投票对象可以是 1 到 10 中的任意编号。 输入是这 10 票的具体投票对象,我们需要统计出 **得票数最高** 的那个学生的得票数。 **注意**: - 不是投票学生的编号,而是被投票学生的编号。 - 需要统计的是“得票数最高的学生”的得票数,而不是学生的编号。 --- ## 🚀 解决方案 ### 🔹 方法一:固定数组计数法(推荐,适合初学者) 因为编号范围固定(1 到 10),可以使用一个长度为 11 的数组(下标从 1 开始使用)来统计每个编号的得票数。 然后遍历数组找出最大值。 **步骤**: 1. 创建一个大小为 11 的整型数组 `votes`,初始化为 0。 2. 循环读取 10 个整数 `v`,执行 `votes[v]++`。 3. 遍历 `votes[1]` 到 `votes[10]`,找出最大值。 4. 输出最大值。 **代码实现(C++)**: ```cpp #include <iostream> #include <algorithm> using namespace std; int main() { int votes[11] = {0}; // 下标1-10有效 int v; // 读取10个投票 for (int i = 0; i < 10; ++i) { cin >> v; votes[v]++; } // 找最大得票数 int max_votes = 0; for (int i = 1; i <= 10; ++i) { if (votes[i] > max_votes) { max_votes = votes[i]; } } cout << max_votes << endl; return 0; } ``` --- ### 🔹 方法二:使用 map 统计(更通用,适合编号范围不确定的场景) 如果编号范围不确定,可以使用 `unordered_map` 或 `map` 来统计。 **代码实现(C++)**: ```cpp #include <iostream> #include <unordered_map> #include <algorithm> using namespace std; int main() { unordered_map<int, int> votes; int v; for (int i = 0; i < 10; ++i) { cin >> v; votes[v]++; } int max_votes = 0; for (auto& p : votes) { if (p.second > max_votes) { max_votes = p.second; } } cout << max_votes << endl; return 0; } ``` --- ## 🔍 关键概念解释 | 概念 | 说明 | |------|------| | `数组` | 固定大小的连续内存区域,适合已知范围的数据统计 | | `votes[v]++` | 以学生的编号作为数组下标,直接累加得票数 | | `unordered_map` | C++ 标准库中的哈希表,适合未知范围的键值统计 | | `遍历找最大值` | 时间复杂度 O(n),是找最大元素的常用方法 | --- ## ⚠️ 常见陷阱与注意事项 1. **数组越界**:如果输入中存在编号为 0 或大于 10 的值,数组方法会越界。但本题保证在 1-10 范围内。 2. **初始化**:必须确保计数数组初始化为 0,否则结果错误。 3. **循环次数**:题目说“10 位学生”,因此循环 10 次,不要多读或少读。 --- ## 🧠 进阶思考 - **如果学生人数可变**:可以使用 `vector` 动态分配数组大小,或使用 `map`。 - **如果要求输出得票最高的学生编号**:在找最大值的同时记录对应的索引。 - **平票情况**:题目只要求输出得票数,不要求输出具体是哪位学生,因此无需处理平票。 --- ## 📚 学习资源推荐 - [C++ 数组官方文档](https://en.cppreference.com/w/cpp/language/array) - [unordered_map 官方文档](https://en.cppreference.com/w/cpp/container/unordered_map) - [C++ 标准库算法 max_element](https://en.cppreference.com/w/cpp/algorithm/max_element) --- ## 🔧 开发建议 - **多测试边界**:如所有票投给同一个人、每人投自己等。 - **注意输入输出格式**:cin/cout 足够快,本题不需要使用 scanf/printf。 - **养成良好的变量命名习惯**:`votes` 比 `v` 更易读,但简单题目中使用短变量也问题不大。 --- ######[AI写代码神器 | 1067点数解答 | 2026-05-23 21:09:41]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)395
- 工程师必知:软件系统用户文档编写九大要点揭秘(百度文心 | 350点数解答 | 2023-11-09 18:23:53)226
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)362
- 用 Pandas 深度剖析数据:从读取到统计分析全流程实战(GPT | 642点数解答 | 2024-06-30 15:39:49)388
- 用 Pandas 深入分析招聘数据:从数据读取到可视化全流程解析(GPT | 1539点数解答 | 2024-06-30 15:56:50)412
- Python 实现:精确统计两数范围内素数个数,附完整代码与优化思路(阿里通义 | 292点数解答 | 2024-11-28 21:36:29)276
- Python 文件数量统计:检测当前及指定路径文件数并处理错误 (字节豆包 | 179点数解答 | 2024-12-11 13:09:13)221
- Python三关挑战:文件与文件夹数量统计及路径获取(字节豆包 | 493点数解答 | 2024-12-11 13:29:49)239
- 星际编码大赛终极对决:机械星AI与异星人激战“逆序对”统计难题(字节豆包 | 509点数解答 | 2025-04-19 17:33:00)301
- Python实现:输入5个字符统计“0”出现次数及开发注意要点(字节豆包 | 255点数解答 | 2026-01-16 14:23:30)69
- 巧用筛法!计算 N 到 M 间数的最大质因数个数(DeepSeek | 245点数解答 | 2026-01-18 12:43:51)59
- C++高效求解1到n中能同时被2和3整除的数之和(DeepSeek | 1187点数解答 | 2026-04-11 10:03:38)36