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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:24:29