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

C语言查找数组最大与第二大元素的代码问题咨询

C语言查找数组最大值、第二大值的实现验证

问题描述

我编写了一段用于查找数组元素最大值、第二大值的C语言代码,想确认是否存在匹配我设计思路的解决方案:我定义的第二大数值需同时满足两个要求:

  • 严格小于数组最大值
  • 大于遍历过程中记录的前序符合要求的数值
    如果本次问题属于重复提问我深表歉意,我确实非常好奇是否存在同类实现思路。

原实现代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int main() 
{
    int arr[10];
    int i;
    int greatest;
    int second;

    printf("Enter 10 values:");

    for (i = 0; i < 10; i++)
    {
        scanf("\n%d", &arr[i]);
    }

    greatest = arr[0];

    for (i = 1; i < 10; i++)
    {
        if (greatest < arr[i])
        {
            greatest = arr[i];
        }
    }

    second = arr[i];
    for (i = 0; i < 10; i++)
    {
        if (arr[i] < greatest && second > arr[i - 1])
        {
            second = arr[i];
        }
    }

    printf("The greatest number is : %d", greatest);
    printf("\nThe second greatest number is: %d", second);

    return 0;
}

原代码问题说明

原代码存在3处会直接导致运行结果错误的问题:

  • 数组越界访问:第一轮找最大值的循环结束后,循环变量i的值为10,此时执行second = arr[i]访问的是数组范围外的内存,拿到的是随机垃圾值;后续第二轮循环i=0时访问arr[i-1]即arr[-1],也是非法的越界访问。
  • 第二大值判断逻辑不符合设计思路:写的判断条件second > arr[i - 1]完全没有关联第二大值的判定规则,既没有校验当前元素是否比已记录的第二大值大,还引入了无关的相邻元素比较逻辑。
  • 第二大值初始化逻辑缺失:没有给second设置合理的初始值,直接用越界取到的垃圾值参与比较,结果完全不可控。

匹配设计思路的修正实现

完全匹配你提出的「第二大值小于最大值、且为遍历过程中大于所有前序符合条件值」的思路,修正后的代码如下:

#include <stdio.h>
#include <limits.h>

int main() 
{
    int arr[10];
    int i;
    int greatest;
    int second;

    printf("Enter 10 values:");
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &arr[i]);
    }

    // 第一遍遍历找最大值
    greatest = arr[0];
    for (i = 1; i < 10; i++)
    {
        if (greatest < arr[i])
        {
            greatest = arr[i];
        }
    }

    // 第二遍遍历找符合要求的第二大值
    second = INT_MIN; // 用int类型最小值做初始值,避免垃圾值干扰
    for (i = 0; i < 10; i++)
    {
        // 满足:小于最大值,且大于当前记录的second(即大于所有之前记录的符合条件值)
        if (arr[i] < greatest && arr[i] > second)
        {
            second = arr[i];
        }
    }

    printf("The greatest number is : %d", greatest);
    printf("\nThe second greatest number is: %d", second);

    return 0;
}

这种两次遍历找前两大值的思路是C语言入门阶段非常经典的基础实现,和你最初的设计方向完全一致,你只是在判断条件和变量初始化环节出了逻辑和语法错误。如果追求更高的遍历效率,也可以改成单次遍历同时更新最大值和第二大值,核心判定逻辑和你的思路没有本质区别。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20