【问题标题】:Finding the largest and second largest number找到最大和第二大的数
【发布时间】:2016-07-15 12:21:44
【问题描述】:

编写一个程序,输入一系列 10 个数字并找出这 10 个数字中的 2 个最大值? (仅使用 if 和循环)

谁能帮我解决这个问题?我试过了,但这是不对的。它不能列出第二大的数字。任何帮助将不胜感激。

  #include "stdafx.h"
  #include <stdio.h>
  #include <stdlib.h>
  #include <math.h>


int main()
{
    int counter = 0, number, largest = 0,largest2=0;
    for (counter = 1; counter <= 10; counter++) {
        printf("Enter number (%d): ", counter);
        scanf_s("%d", &number);
        if (number > largest)
        {
            largest = number;
        }
        else
        {
            if (number > largest2)
                largest2 = number;
        }
    }
    printf("The largest number is %d\n", largest);
    printf("The second largest number is %d\n", largest2);
    system("pause");
    return 0;
}

【问题讨论】:

  • 这是作业吗?呵呵
  • 顺便说一句,您应该使用“INT_MIN”作为最大的初始化 - 如果我写 -10,-11,.. 作为输入怎么办?从零开始,您将获得最大的 0,但事实并非如此 :) 查看常量,例如。那里有en.wikibooks.org/wiki/C_Programming/C_Reference/limits.h
  • 您希望如何处理重复值?例如,您期望输入“9 9 10 10 10 10 10 10 10 10 10”的输出是什么?根据定义,第二大值是 9 或 10。
  • 对不起,我忘了。 "每个数字只输入一次"
  • 没错。哈哈@Vini.g.fer

标签: c


【解决方案1】:

当你得到一个新的最大数时,旧的最大数成为第二大数。因此,您只需要一次检查最大数字和两次分配。

类似

if (number > largest)
{
    largest2 = largest;
    largest = number;
}

您仍然需要检查大于largest2 的数字。

【讨论】:

    【解决方案2】:

    你的逻辑必须精炼:

    • 当您获得新的最大数字时,您还必须更新第二大数字,因为之前的最大数字将变为第二大数字。
    • 此外,您应该将最大和第二大初始化为INT_MIN,以便正确处理负数。
    • 您还必须检查scanf_s()的返回值,如果用户输入数字失败,则退出。

    这是一个改进的版本:

    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int number, largest = INT_MIN, largest2 = INT_MIN;
    
        for (int counter = 1; counter <= 10; counter++) {
            printf("Enter number %d: ", counter);
            if (scanf_s("%d", &number) != 1) {
                printf("input failure\n");
                return 1;
            }
            if (number > largest) {
                largest2 = largest;
                largest = number;
            } else
            if (number > largest2) {
                largest2 = number;
            }
        }
        printf("The largest number is %d\n", largest);
        printf("The second largest number is %d\n", largest2);
        system("pause");
        return 0;
    }
    

    【讨论】:

    • 谢谢你!
    • 我的荣幸。您可以对此以及任何其他对您有帮助的答案进行投票。
    【解决方案3】:

    在以下代码中:

    if (number > largest)
        {
        largest = number;
        }
    

    你扔掉已知最大的数字,而那个数字应该成为第二大数字。所以你应该添加行最大2 = 最大。

    注意:通过将最大和最大 2 初始化为零,该算法将不适用于负数。

    【讨论】:

    • 谢谢 MrBastK!
    【解决方案4】:

    如果number 大于largest,你也应该更新largest2,因为现在你发现了一个比之前任何一个都大的数字,largest 成为第二大数字!

        if (number > largest)
        {
            largest = number;
        }
    

    变成

        if (number > largest)
        {
            largest2 = largest;
            largest = number;
        }
    

    【讨论】:

    • @dave 你不必感谢所有回答你问题的人。只是不推荐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多