Как найти третье по величине целое число в C без использования массивов?

#c #math

#c #математика

Вопрос:

Мне нужна помощь, моя программа не работает, она продолжает показывать мне 0 в качестве значения! Что не так с моим кодом?

программа требует от пользователя ввести количество целых чисел в начале.

 #include <stdio.h>
int main(void)
{   
    int num;
    int largest= 0;
    int secondlargest= 0;
    int thirdlargest=0;
    printf("Please enter the number of integers:");
    scanf("%d", amp;num);

    if(num > 2)
    {
        scanf("%d",amp;largest);

        while(--num > 0)
        {   
            int tmp;
            scanf("%d",amp;tmp);
            if(tmp>largest)
            largest=tmp;

            if(tmp > secondlargest amp;amp; tmp < largest)
            secondlargest=tmp;

            if(tmp > thirdlargest amp;amp; tmp < secondlargest amp;amp; tmp < largest)
            thirdlargest=tmp;
        }
            printf("The third largest number is %dn",thirdlargest);

    }
    else
    {
        printf("There is no third largest number.");
    }
    return 0;
    }
  

вот мой код, как написано выше! Мне нужно отправить его без использования массива! Любая помощь будет высоко оценена!

Комментарии:

1. почему C# тег?

2. Что должно быть напечатано в случае, если указано 3 числа и введено 3 одинаковых числа — следует ли печатать это значение как третье по величине, выводить ноль или вы хотите напечатать «Третьего по величине числа нет»?

Ответ №1:

Когда вы нашли первое или второе по величине, вам нужно «сдвинуть» меньшие (и вы можете заменить свое второе и третье if на ‘else if’). Если вы хотите обрабатывать ввод отрицательных значений, установите для 3 наибольших наименьшее значение int. И используйте >= вместо> для обработки дубликатов.

     int num;
    int largest = INT_MIN;
    int secondlargest = INT_MIN;
    int thirdlargest = INT_MIN;
    printf("Please enter the number of integers:");
    scanf_s("%d", amp;num);

    if (num > 2)
    {
        scanf_s("%d", amp;largest);

        while (--num > 0)
        {
            int tmp;
            scanf_s("%d", amp;tmp);
            if (tmp >= largest){
                thirdlargest = secondlargest;
                secondlargest = largest;
                largest = tmp;
            } 
            else if (tmp >= secondlargest){
                thirdlargest = secondlargest;
                secondlargest = tmp;
            } 
            else if (tmp > thirdlargest)
                thirdlargest = tmp;
        }
        printf("The third largest number is %dn", thirdlargest);

    }
    else
    {
        printf("There is no third largest number.");
    }
    return 0;
  

Комментарии:

1. Действительно, но, учитывая исходный код, я подумал, что это не будет важно. Вам просто нужно инициализировать 1-е, 2-е и 3-е по величине до минимально возможного int

2. Этот код не работает, если есть одно или несколько повторяющихся чисел, например, 3 числа 1 3 3 возвращают 0 как третье по величине.

3. Действительно. Я исправил это. Но поскольку это не был первоначальный вопрос, не уверен, что мы должны охватить все случаи, а не позволять ему находить от себя.

Ответ №2:

Если вы хотите обрабатывать и отрицательные значения, установите для ваших трех наибольших значений минимальное целое число. Также используйте else if вместо if , чтобы вы могли использовать простые сравнения вместо составных, с последующим сдвигом ваших переменных:

 #include <stdio.h>
#include <limits.h>

int main(void)
{
    int number;

    printf("Please enter the number of integers: ");
    (void) scanf("%d", amp;number);

    if (number < 3)
    {
        printf("There is no third largest number.");

        return 1;
    }

    int largest = INT_MIN;
    int secondlargest = INT_MIN;
    int thirdlargest = INT_MIN;

    while (number-- > 0)
    {
        int temporary;
        (void) scanf("%d", amp;temporary);

        if (temporary > largest)
        {
            thirdlargest = secondlargest;
            secondlargest = largest;
            largest = temporary;
        }
        else if (temporary > secondlargest)
        {
            thirdlargest = secondlargest;
            secondlargest = temporary;
        }
        else if (temporary > thirdlargest) {
            thirdlargest = temporary;
        }
    }

    printf("The third largest number is %dn", thirdlargest);

    return 0;
}
  

Ответ №3:

Некоторый псевдокод, который упрощает и корректирует вашу if() структуру.

 int largest1 = INT_MIN;
int largest2 = INT_MIN;
int largest3 = INT_MIN;

int input = ...;

if (input > largest3) {
  largest3 = input;
  if (largest3 > largest2) {
    swap(largest2, largest3);
    if (largest2 > largest1) {
      swap(largest1, largest2);
    }
  }
}