【问题标题】:Find indexes of max numbers in array查找数组中最大数字的索引
【发布时间】:2022-01-12 22:41:31
【问题描述】:

我在 c 中有一个程序可以在数组中找到第一个和第二个最大值,但我想获取这些元素的索引。这是我的代码:

#include <stdio.h>
int main(){
    int max1,max2,n;
    scanf("%d",&n);
    int a[n],i;
    int i_m1,i_m2;
    i_m1 = i_m2=0;
    for(i = 0;i < n;i++){
        scanf("%d",&a[i]);
    }
    max1 = max2 = 0;
    for(i = 0;i < n;i++){
        if(a[i]>max1){
            max1=a[i];
            //i_m1++;
        } else if(a[i]>max2 && a[i]<max1){
            max2=a[i];
            //i_m2++;
        }
    }
    printf("%d %d\n",max1,max2);
    //printf("%d %d\n",i_m1,i_m2);
    for(i = 0;i < n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

我首先输入数组中元素的数量,然后输入数组。 例如,如果我有一个数组

number of elements: 5
elements in array: 
3 4 2 5 1
indexes:
0 1 2 3 4
max1=5, max2=4
i_m1=3, i_m2=1

如何获取索引 i_m1 和 i_m2 ?

【问题讨论】:

  • 你不想做i_m1++;,你想做i_m1 = i;

标签: arrays c algorithm for-loop max


【解决方案1】:

您在考虑如何处理 i 问题上想得太多了,注释掉的 i_m1++i_m2++ 就证明了这一点。

如果 max1=a[i]; 则遵循 i_m1 = i;max2/i_m2

【讨论】:

    【解决方案2】:

    对于初学者,即使是这个 if-else 语句

    for(i = 0;i < n;i++){
        if(a[i]>max1){
            max1=a[i];
            //i_m1++;
        } else if(a[i]>max2 && a[i]<max1){
            max2=a[i];
            //i_m2++;
        }
    }
    

    错了。

    if 语句的条件

        if(a[i]>max1){
    

    如果max1 不等于max2,则在更改max1 之前,您还需要将max1 分配给max2

    该方法可以如下所示

    if ( n < 2 )
    {
        i_m1 = 0;
        i_m2 = 0;
    }
    else
    {
        if ( a[0] < a[1] )
        {
            i_m1 = 1;
            i_m2 = 0;
        }
        else
        {
            i_m1 = 0;
            i_m2 = 1;
        }
    
        for ( i = 2; i < n; i++ )
        {
            if ( a[i_m1] < a[i] )
            {
                if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
                i_m1= i;
            }
            else if ( a[i_m2] < a[i] )
            {
                i_m2 = i;
            }
        }
    }
    
    printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
    printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );        
    

    这是一个演示程序。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main( void )
    {
        enum { N = 10 };
        int a[N];
        int n = N;
        
        srand( ( unsigned int )time( NULL ) );
        
        for ( int i = 0; i < n; i++ )
        {
            a[i] = rand() % N;
        }
    
        for ( int i = 0; i < n; i++ )
        {
            printf( "%d ", a[i] );
        }
        
        putchar( '\n' );
        
        //  Below the algorithm for a variable length array
        
        int i_m1 = 0, i_m2 = 0;
    
        if ( !( n < 2 ) )
        {
            if ( a[0] < a[1] )
            {
                i_m1 = 1;
                i_m2 = 0;
            }
            else
            {
                i_m1 = 0;
                i_m2 = 1;
            }
    
            for ( int i = 2; i < n; i++ )
            {
                if ( a[i_m1] < a[i] )
                {
                    if ( a[i_m2] < a[i_m1] ) i_m2 = i_m1;
                    i_m1= i;
                }
                else if ( a[i_m2] < a[i] )
                {
                    i_m2 = i;
                }
            }
        }
    
        printf( "max1 = %d max2 = %d\n", a[i_m1], a[i_m2] );
        printf( "i_m1 = %d i_m2 = %d\n", i_m1, i_m2 );      
    }
    

    它的输出可能看起来像

    0 3 5 0 3 8 8 2 5 6 
    max1 = 8 max2 = 8
    i_m1 = 5 i_m2 = 6
    

    【讨论】:

      【解决方案3】:

      也是逻辑错误。

      一旦找到新的max1,旧值应成为新的max2

          if(a[i]>max1){
              max2 = max1; // add
              max1 = a[i];
          } else if(a[i]>max2 && a[i]<max1){
              max2=a[i];
          }
      

      【讨论】:

      • 是的,我知道,但对于我的程序,它只需要找到比 max1 更小的 max2
      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多