Найти срединное число

8 Август 2019 - Время чтения: 14 минуты

Условие задачи: Даны три разных числа, найти срединное из них, т.е. такое, которое расположено на числовой прямой между двумя остальными. Например, для чисел 5, 7 и -1 срединным является 5.

Это одна из моих любимых задач, потому что она является великолепной иллюстрацией того, что главное при написании любой программы - не программировать, а думать. А уж хорошо продуманный алгоритм легко реализуется на любом языке. Бывают случаи, когда пишешь пару десятков строк, а потом вдруг доходит, что можно было написать в две-три строки, а то и в одну.

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


Программа на языке Pascal
var a, b, c: integer;
 
begin
    readln(a, b, c);
    if a < b then begin
        if b < c then begin
            writeln(b);
        end else begin
            if a > c then begin
                writeln(a);
            end else begin
                writeln(c);
            end;
        end;
    end else begin
        if b > c then begin
            writeln(b);
        end else begin
            if a < c then begin
                writeln(a);
            end else begin
                writeln(c);
            end;
        end;
    end;
end.

Вы только посмотрите на этот ужас! Конечно, кто-то может сказать, что можно было написать получше и покороче. Но я специально написал так подробно и тщательно, чтобы не запутаться.

Существует ещё один подход, для ленивых: отсортировать числа и возвратить второе из них. Он тоже имеет право на существование, на некоторых языках вообще получится в одну строчку.


Программа на языке Python
print(sorted(map(int, input().split()))[1])

Программа на языке C#
using System;
using System.Linq;
 
class Medial
{
    public static void Main()
    {
        Console.WriteLine(Console.ReadLine().Split().Select(Int32.Parse).OrderBy(x => x).Skip(1).First());
    }
}

Хотелось бы решение поизящнее, при этом эффективное и понятное одновременно. Возможно ли это? Я постараюсь!

Итак, моё решение: Применим рекурсию. Рассмотрим сначала случай, когда числа уже расположены по порядку (по возрастанию или убыванию). Если это не так - просто вызовем ту же функцию, сдвинув параметры.

Программа на языке C
#include <stdio.h>
 
int medial(const int a, const int b, const int c)
{
    return a <= b && b <= c || a >= b && b >= c ? b : medial(b, c, a);
}
 
int main(void)
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    printf("%d", medial(a, b, c));
    return 0;
}

Мне этот способ нравится больше других, но возможно кто-то придумает ещё лучше? Пишите в комментариях!

Currently there are no comments, so be the first!

Коротко обо мне

Меня зовут Вадим Тукаев, я репетитор по информатике и программированию. Вы можете сконтактировать со мной по почте vadimtukaev@gmail.com или по скайпу pol6energetik. Рассмотрю и другие предложения о сотрудничестве, включая, но не ограничиваясь, написание заказного ПО для Windows/Linux.

Категории