如何编写C程序查找数组中所有最大值元素的索引?
C程序实现:查找数组所有最大值的索引
可行方案1:两次遍历实现
逻辑清晰,适合新手理解:
#include<stdio.h> int main(void) { size_t arr[] = {2,8,10,7,10}; // 计算数组长度,避免硬编码 size_t arr_len = sizeof(arr) / sizeof(arr[0]); size_t max = arr[0]; // 存储最大值索引,长度与原数组一致(最坏情况所有元素都是最大值) size_t indices[arr_len]; size_t count = 0; // 第一步:遍历数组找到最大值 for(size_t i = 0; i < arr_len; ++i) { if(arr[i] > max) { max = arr[i]; } } // 第二步:收集所有等于最大值的元素索引 for(size_t i = 0; i < arr_len; ++i) { if(arr[i] == max) { indices[count++] = i; } } // 输出结果(位置为索引+1,符合日常计数习惯) for(size_t i = 0; i < count; ++i) { printf("Max Value: %zu ----> Position: %zu\n", max, indices[i] + 1); } return 0; }
可行方案2:一次遍历优化版
适合处理大型数组,减少遍历次数:
#include<stdio.h> int main(void) { size_t arr[] = {2,8,10,7,10}; size_t arr_len = sizeof(arr) / sizeof(arr[0]); size_t max = arr[0]; size_t indices[arr_len]; size_t count = 0; // 一次遍历完成最大值查找+索引收集 for(size_t i = 0; i < arr_len; ++i) { if(arr[i] > max) { // 发现更大值,更新最大值并重置索引收集 max = arr[i]; count = 0; indices[count++] = i; } else if(arr[i] == max) { // 等于当前最大值,添加索引 indices[count++] = i; } } // 输出结果 for(size_t i = 0; i < count; ++i) { printf("Max Value: %zu ----> Position: %zu\n", max, indices[i] + 1); } return 0; }
原代码错误分析
你的代码无法得到正确结果的核心原因:
- 嵌套循环逻辑冗余且错误:外层循环执行5次,每次内层遍历都会将
indices[j]覆盖为最后一个最大值的索引(下标4),导致所有输出都是同一个位置。 - 索引收集逻辑缺失:没有维护计数器记录有效索引数量,也没有准确判断元素是否等于最大值(用了
>=而非==),只是重复覆盖数组元素。
内容的提问来源于stack exchange,提问作者Usual_Learner
相关产品推荐
相关产品推荐

