【问题标题】:Finding the second highest number寻找第二高的数字
【发布时间】:2018-01-10 02:40:49
【问题描述】:

我想在不使用数组的情况下从序列中找出第二大的数字

说明如下。

给定一个整数序列作为输入,以 a 结尾 -1。 (即输入的整数可能是正数、负数或0。A -1 在输入信号中表示输入的结束。)

-1 不被视为输入的一部分。

在输入中找到第二大的数字。你不能使用数组。

我做的是这个。

#include <stdio.h>

int main(void) {
    int i, a, temp, sec;
    while (1) {
        scanf("%d", &a);
        if (a == -1) ;
            break;

        temp = a;
        while (1) {
            scanf("%d", &a);
            if (a == -1) {
                break;
            }
            if (a > temp) 
                sec = temp;
            else 
                sec = a;
        }
    }

    printf("%d", sec);
    return 0;
}

示例测试用例如下所示。

Sample Test Cases
Input   
Test Case 1 
-840 -288 -261 -337 -335 488 -1
Output
-261
Test Case 2 
-840 -335 -1
Output
-840

我不知道从哪里开始,哪里出错了。

【问题讨论】:

  • 您上面的代码对于给定的输入不正确。
  • 这没有给出正确的答案。拜托,你能纠正一下吗?
  • 它给出了正确答案,你认为正确答案是什么?
  • 对于第一个测试用例,实际输出显示这个 32764
  • 如果你在对话中被要求这样做,你会怎么做。我会给你背一串数字,你不能把它们都写下来。当我完成时,你必须告诉我第二高数字的值。你会怎么做。注意,你可以写下 2 个数字。

标签: c


【解决方案1】:

我不会解决你的作业,但会提供一些提示:

  1. 您应该为变量提供能反映其用途的清晰名称。 iatempsec 之类的名称使代码难以推理。

  2. 您应该初始化所有变量。比如sec的初始化有点不确定。

  3. 您不需要两个循环。

  4. 下面的if 是空操作(意味着后面的break 是无条件执行的):

    if (a == -1) ;

最后,也是最重要的,在迭代数字时需要处理三种情况:

  1. 当前数字大于迄今为止看到的最大数字。

  2. 当前数字不大于最大数字,但大于迄今为止看到的第二大数字。

  3. 当前数字不大于第二大数字。

希望这将为您提供足够的方向以取得更大的进步。如果您遇到困难,请发布另一个问题。

【讨论】:

    【解决方案2】:

    这个怎么样?

    编辑:适用于 SUSE Linux 11 上的 GCC 4.3.4 版

    #include <stdio.h>
    #include <limits.h>
    
    int main(void) {
      int i, a, temp, sec, largest;
      sec = INT_MIN;
      largest = INT_MIN;
      while (1) {
        scanf("%d", &a);
        if (a == -1) {
            break;
        }
        if (a > largest) {
            sec = largest;
            largest = a;
        } else if (a > sec) {
            sec = a;
        }
      }
    
      printf("%d", sec);
      return 0;
    }
    

    我没有纠正一些不好的代码气味,但我只是做了一个快速而肮脏的答案

    【讨论】:

    • 请发表评论,以便我改进我的答案,不要投反对票
    • NMDV, int sec = -INFINITY;未定义的行为
    • 我不明白这是什么意思,我只是编译了这个,它可以工作。 INFINITY 在我包含的 math.h 中定义。这个答案也证实了这个here
    • INFINITY&lt;math.h&gt; 中定义,它是一个超出int 范围的大值。将int 范围之外的值分配给int 是个问题。它是 未定义的行为实现定义的行为 - 我需要检查一下。为什么不使用sec = INT_MIN; - 没问题?
    • sec = -INFINITY; --> "否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。"跨度>
    【解决方案3】:

    试试这个。

    #include <stdio.h>
    #define INT_MIN -999999;  //define minimum value
    
    int main() {
      int input, firstMax = INT_MIN;
      int secMax = INT_MIN;
      do {
        scanf("%d", &input);
        if (input == -1)
        break;
    
        if(input > firstMax) {  //find new first max value
            secMax = firstMax;  //set previous max to second max
            firstMax = input;   //update first max to new value
        }
        else if(input > secMax) {
            secMax = input;     //new second max value is found. update it
        }
      } while(1); 
    
      printf("%d", secMax);
      return 0;
    }
    

    【讨论】:

    • input &lt;= firstMax &amp;&amp; 用于 safa gaurd。它不会受伤。而且我没有使用图书馆来迷惑他。他似乎是新手。
    【解决方案4】:

    你可以试试这个方法:

    #include <stdio.h>
    #include <limits.h>
    
    
    int main() {
      int a, first = INT_MIN, sec = INT_MIN;
      while(1){
        scanf("%d", &a);
        if (a == -1)
          break;
    
        if(a > first) {
            sec = first;
            first = a;
        }
        else if(a > sec) {
            sec = a;
        }
      }
    
      printf("%d", sec);
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2019-04-17
      • 2015-01-02
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多