在不使用数组的情况下从stdin中查找第二大元素

时间:2014-08-25 20:17:53

标签: c

#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

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

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

8 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

/* 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;
        }

答案 2 :(得分:0)

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

m2 = -1000000;

<强> outout

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,那么你想要第三大。记住:

始终初始化您的变量

答案 3 :(得分:0)

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

  #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);

  }

答案 4 :(得分:0)

/*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;
}

答案 5 :(得分:0)

/* program to find the second largest number in the given list  without 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;
}

答案 6 :(得分:0)

/ *程序在没有数组* /

的情况下查找给定列表中的第二大数字
public static void main(String[] args)
{
    Scanner input=new Scanner(System.in);
    int n=1;
    int large1=0,large2=0;

    while(n !=10){


        System.out.print("Enter number:");
        int num=input.nextInt();

            if(large1<num)
            {
                large2=large1;
                large1=num;


            }
            else if(num>large2)
                    large2=num;

    n++;
    }
    System.out.println("\nLargest number1= "+ large1);
    System.out.println("\nLargest number2= "+ large2);
}

}

答案 7 :(得分:0)

复杂性较低的简单解决方案

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
    // write your code here
        Scanner scanner = new Scanner(System.in);
        int n =  scanner.nextInt();
        int max = 0 ;
        int temp = 0  ;
        int size = (int)(Math.log10(n)+1); 
        for(int i = 0 ; i<size;i++){
            int m = n%10;
            if(m>max){
                temp = max;
                max = m;
            }
            else if(temp < m) {
                temp = m ;
            }
            n /= 10;
        }
        System.out.print(temp);
    }
}