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

如何用C语言获取数组第二大元素?现有代码输出异常求修正

修正数组找第二大元素索引的C代码

你的代码核心问题在于第二大元素的更新逻辑错误,以及初始值设置不够严谨,导致无法正确追踪第二大元素的索引。

原代码的问题点

  1. 初始值设置缺陷:max和smax都初始化为0,若数组第一个元素不是最大值,后续逻辑容易出现偏差。
  2. 第二大元素更新逻辑错误:当当前元素小于最大值时,直接将smax设为当前索引,忽略了该元素可能比当前smax对应值更小的情况,会错误覆盖正确的第二大索引。

修正后的代码

#include<stdio.h>
int main(){
    int i, max, smax;
    int A[] = {2,44,6,8,9,10,47};
    // 自动计算数组长度,避免硬编码出错
    int n = sizeof(A) / sizeof(A[0]);

    // 初始化max和smax:先比较前两个元素,确定初始的最大和第二大索引
    if(A[0] > A[1]){
        max = 0;
        smax = 1;
    } else {
        max = 1;
        smax = 0;
    }

    // 从第三个元素开始遍历
    for(i = 2; i < n; i++){
        if(A[i] > A[max]){
            // 当前元素比最大值大:第二大继承原最大值,最大值更新为当前元素
            smax = max;
            max = i;
        } else if(A[i] > A[smax] && A[i] != A[max]){
            // 当前元素比第二大但小于最大值:更新第二大索引
            smax = i;
        }
        // 如果当前元素等于最大值,不更新第二大(若需要允许第二大等于最大值,可去掉&& A[i] != A[max])
    }

    printf("First value: %d (index: %d)\n", A[max], max);
    printf("Second value: %d (index: %d)", A[smax], smax);
    return 0;
}

代码说明

  • 初始化优化:先比较数组前两个元素,确保max和smax初始指向正确的较大和较小元素索引,避免初始值偏差。
  • 逻辑修复:只有当当前元素大于smax对应值且不等于最大值时,才更新smax,保证第二大元素的追踪准确。
  • 灵活的数组长度计算:用sizeof(A)/sizeof(A[0])自动计算数组长度,避免硬编码n导致的错误。

运行修正后的代码,会得到正确输出:

First value: 47 (index: 6)
Second value: 44 (index: 1)

内容的提问来源于stack exchange,提问作者user20030574

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:40:33