Найти в Дзене
Александр Долгих

Задача про акционеров и рукопожатия. Показываю два решения: программиста и математика

Оглавление

Это довольно известная в узких кругах задача про совещания и рукопожатия на них. Её можно решить с помощью "треугольных" чисел, о которых знают математики, а можно за 2 минуты написать программу на коленке и компьютер всё быстренько посчитает, пока вы будете пить кофе. Я покажу и тот и другой способ, но вы для начала попробуйте решить сами.

Сергей Иванович организовал совещание акционеров в конференц-зале пятизвездочной гостиницы. Акционеры заходили в зал по одному и каждый заходящий здоровался за руку со всеми, кто уже был в зале. Известно, что всего было 120 рукопожатий. Сколько людей было на совещании?

Кадр из фильма "Волк с Уолл-стрит", 2013 год. Режиссёр: Мартин Скорсезе
Кадр из фильма "Волк с Уолл-стрит", 2013 год. Режиссёр: Мартин Скорсезе

Как решил бы математик

Первым в зал пришел Сергей Иванович. Он был один, поэтому ни с кем не здоровался. Потом зашел кто-то ещё и они поздоровались. Затем пришел третий акционер и поздоровался с Сергеем Ивановичем и другим акционером — это два рукопожатия. Да плюс одно рукопожатие, которое уже было — три.

Затем зашел четвертый человек, поздоровался с тремя уже присутствующими — три рукопожатия. Да плюс три рукопожатия, которые были до этого — итого шесть.

Когда зашел пятый, он поздоровался с каждым из четырех — 4 рукопожатия. Да плюс 6 рукопожатий, которые были до этого, в сумме дают 10 рукопожатий.

И так далее. Мы можем считать таким образом рукопожатия до тех пор. пока не достигнем 120. Но это долго и скучно (пусть так считает компьютер), а я общеал красивое математическое решение с "треугольными числами".

Давайте изобразим рукопожатия в виде точек.

-2

Как видите, точки можно расставить в виде правильных треугольников. Именно поэтому числа 1, 3, 6, 10, 15 и так далее называются "треугольными". Я сейчас не буду вдаваться в подробности и то, как выводится формула "треугольных" чисел, но её можно записать так: n²+n=2T, где n — это номер шага, а Т — количество точек в треугольнике.

В нашем случае Т — это количество рукопожатий, а n=(количество человек-1), потому что на первом шаге у нас одна точка (одно рукопожатие), а это соответствует двум людям, на втором шаге три рукопожатия, которые соответствуют трем людям в комнате и так далее.

По условию задачи Т=120. Подставляем и считаем: n²+n-240=0; D=1+960=961=31². Получаем корни n=15 или n=-16. Отрицательный вариант нам по понятным причинам не подходит, так как не может быть отрицательное количество человек в комнате. Значит, n=15. Осталось вспомнить, что n=(количество человек-1), следовательно количество человек в комнате равно (n+1)=15+1=16. Всё, задача решена.

Как бы решал программист

Теперь давайте посмотрим, как эту же задачку решил бы программист. Он бы не стал заморачиваться, что-то считать и рассуждать, потому что гораздо проще и быстрее написать 5-10 строк кода и сделать один цикл, в котором компьютер за доли секунды найдет верный ответ. Код в зависимости от языка программирования будет выглядеть по-разному, поэтому я нарисую алгоритм, а вы можете написать программу.

Алгоритм программы, вычисляющей количество людей в комнате.
Алгоритм программы, вычисляющей количество людей в комнате.

Первым делом объявляем переменные. Начнем с момента, когда в комнате находится только Сергей Иванович и он ещё ни с кем не здоровался за руку. То есть Л (количество людей в комнате) = 1, а Р (количество рукопожатий) = 0.

Затем идёт проверка условия, что Р<120. Понятно, что на первом шаге у нас Р=0 и мы идем по стрелке "Да". Теперь увеличиваем переменную Л на единицу (Л=Л+1), а число рукопожатий увеличиваем на (Л-1). В конце первого шага Л=2; Р=0+(2-1)=1, то есть два человека в комнате и одно рукопожатие. Дальше снова проверяем условие того, что Р<120.

Так как Р=1, снова идём по стрелке "Да" и вновь увеличиваем переменную Л на единицу, а число рукопожатий на (Л-1). В конце второго шага получаем Л=2+1=3, а Р=1+(3-1)=1+2=3. Снова проверяем условие Р<120 и снова идем по стрелке "Да".

В конце третьего шага получаем: Л=3+1=4; Р=3+(4-1)=3+3=6.

В конце четвертого шага: Л=4+1=5; Р=6+(5-1)=6+4=10.

Как видим, наш алгоритм работает, всё совпадает с математическим решением, поэтому оставляем вычисления на совести компьютера и после последней проверки в алгоритме, когда Р=120, идем по стрелке "Нет" и выводим результат: Л=16.

Какой способ решения вам ближе? Как бы вы решили задачу? Не забываем, что помимо этого блога у меня есть каналы на Ютубе, в Инстаграме и ТикТоке.

Ещё интересно: Какие 4 банки выбрать, чтобы ими можно было отмерить целое количество литров от 1 до 40

Головоломка из соцсетей про альпиниста, которую решили только 3 из 94. Математика тут не поможет

Не игра в кальмара, конечно, но тоже сложная южнокорейская головоломка