【问题标题】:Find 2nd largest element from stdin without using an array在不使用数组的情况下从标准输入中查找第二大元素
【发布时间】:2014-08-25 20:17:53
【问题描述】:
#include<stdio.h>

int main() {
    int i, m1, m2, n, num;
    puts("\n");
    scanf("%d",&n);
    for(i = 0; i < n; i++) {
         scanf("%d", &num);
         if(i == 0) {
              num = m1 = m2;
         }
         if(num > m1) {
              m2 = m1; 
              m1 = num; 
         } else if(num > m2) {
              m2 = num;
         }
     }
    return 0;
}

我的标准输入:-950 -588 -169 -187 -445 400 -1

我必须得到标准输出:-169,但它显示标准输出:\n

注意:我想在没有数组的情况下解决这个问题。

【问题讨论】:

  • 好吧,你永远不会printf() 结果...
  • @cdhowie 你能详细说明一下吗?
  • i == 0num = m1 = m2 用未定义的值覆盖您读取的num。代码假定 m1m2 已定义,但最初并未定义。
  • @NidhiMurthy 我的意思是你计算了一个结果,但你从不写出来。你把它扔掉。如果你想让你的程序有一些输出,你需要让它写一些输出。
  • @NidhiMurthy 实际输出为空白,因为你从不写任何输出

标签: c


【解决方案1】:

声明:

num = m1 = m2;

是错误的,它不会导致三个变量具有相同的值。您需要将 m1 和 m2 分配给 num。您正在覆盖您之前读取的变量。将其更改为:

m1 = num;
m2 = num;

然后,打印出 m2。

编辑:

正如其他人发现的那样,-1 表示输入结束。添加简单的 if 语句可以解决问题,对于您的输入,-169 是第二大元素。
完整代码:

#include<stdio.h>
int main(){
int i, m1, m2, n, num;
puts("\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
     scanf("%d",&num);
     if(i==0)
     {
          m1 = num;
          m2 = num;
     }
     else if(num == -1)  /* if -1 was read, then terminate the loop. */
     {
         break;
     }
     else if(num>m1)
     {
          m2 = m1; 
          m1 = num; 
     }
     else if(num>m2)
     {
          m2=num;
     }
 }
printf("%d\n",m2);
return 0;
}

输入:

7
-950 -588 -169 -187 -445 400 -1

当前代码输出为-169。


另一个编辑:
好的,由于元素数量的 scanf ,您的代码是错误的。将来如果您更清楚自己的问题会有所帮助。我希望下面的代码对你有用。

#include <stdio.h>

int main(void)
{
    int curr, second, first;
    scanf("%d", &curr);
    second = curr;
    first = curr;
    while (1) {
        scanf("%d", &curr);
        if (curr == -1) {
            break;
        }
        if (curr > first) {
            second = first;
            first = curr;
        }
        else if (curr > second) {
            second = curr;
        }
    }
    printf("%d\n",second);
    return 0;
}

【讨论】:

  • 实际输出和预期输出与您的代码不匹配。它给了我这个输出 \n \n 32767\n
  • 是的。 -1 是输入中的第二大元素。 -169 是第三个。
  • 但它显示的是 32767 而不是 -169。我也尝试使用其他测试用例 stdin: -840 -288 -261 -337 -335 488 -1 stdout: -32767 而不是 -261
  • 您是否首先提供了一些将被读取的元素(在您的情况下为 7)?此外,在这另一组元素中,-1 也是第二大元素。
  • 为什么不直接把continue改成ifelse if
【解决方案2】:
/* Program to find the second largest number without using array */
        main()
        {
         int num,large=0,slarge=0,i=0;
         clrscr();
         printf("Enter the number:");
         while(i<10)
         {
          scanf("%d",&num);
          if(i==0)
          {
          large=num;
          }
          else if(num>large)
          {
           slarge=large;
           large=num;
          }
          else if(num>slarge)
          {
           slarge=num;
          }
          i++;
         }
         printf("Large number:%d",large);
         printf("\nSecond large=%d",slarge);
         getch();
         return 0;
        }

【讨论】:

    【解决方案3】:

    您的代码的问题是您使用的是未初始化的m2。要解决此问题,请将m2 设置为某个合理的负数(例如允许的最小整数)。这里我们只是用一个负数来举例:

    m2 = -1000000;
    

    输出

    argument [0]:  -950
    argument [1]:  -588
    argument [2]:  -169
    argument [3]:  -445
    argument [4]:  400
    argument [5]:  -1
    
    m1: 400
    m2: -1
    

    您的代码按照您的意愿行事。 -1 是第二大数字(400 是最大的数字)。如果你想要-169,那么你想要第三大。记住:

    始终初始化您的变量

    【讨论】:

      【解决方案4】:

      这是一个工作且更简单的版本:

        #include <stdio.h>
        #include <limits.h>
      
        int main(int argc , char** argv)
        {
          int m1 , m2 , rc = 1;
          m1 = m2 = INT_MIN ;
      
          while(rc)
          {
                  scanf("%d" , &rc);
                  if(rc > m1)
                          m1 = rc;
                  else if(rc < m1 && rc > m2)
                          m2 = rc;
      
          }
          printf("%d\n" , m2);
      
        }
      

      【讨论】:

        【解决方案5】:
        /*Second largest elements in a given array*/
        #include <stdio.h>
        int SecondMax(int a[], int n) // n= array size 
        {
            int max1, max2;     //assume max1 as largest and max2 is second largest 
            max1= max2= a[0];   //Initialize first element of array
            for(int i=0; i<n; i++)
            {
                if(a[i] > max1) //check each elements of array with max1 
                {
                    max2= max1; 
                    max1= a[i];
                }
                else if(a[i] > max2)
                    max2= a[i];
            }
            return max2;
        }
        
        int main()  
        {
            int a[10]={2, 54, 8, 9 ,12, 6, 3, 7, 32, -5};
        
            printf("\nmax2= %d", SecondMax(a, 10)); //print return value 
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-08
          • 2012-12-25
          • 2016-03-19
          • 2019-05-02
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多