Задача тайм!
Начальник транспортного цеха пригласил несколько человек на совещание. Каждый, кто входил в кабинет, пожимал руки всем остальным. Сколько человек участвовало в совещании, если всего получилось 120 рукопожатий?
Эту задачу можно решить двумя способами: как математик или как программист.
Математики любят красивые числовые последовательности, которые подчиняются строгим формулам. Мы тоже попробуем получить такую последовательность и посмотрим, есть ли для неё какая-то готовая формула.
В самом начале у нас есть один человек — сам начальник транспортного цеха. Он руки никому не жмёт, поэтому для одного человека количество рукопожатий равно 0.
Когда приходит второй, он жмёт руку только начальнику, потому что больше никого пока нет. Значит, для двух человек количество рукопожатий равно 1.
Третий пожмёт руки им обоим, сделав 2 рукопожатия, а общее количество рукопожатий станет равным 1 + 2 = 3.
Четвёртый пожмёт руки трём присутствующим, сделав три рукопожатия, и общее число рукопожатий получится 3 + 3 = 6.
Наконец, пятый пожмёт руки 4 раза и увеличит общее число до 6 + 4 = 10.
Запишем эту последовательность:
0, 1, 3, 6, 10.
Глядя на это, каждый математик воскликнет: «Да это же треугольные числа!»
Нам надо из самого числа найти его номер, чтобы понять, какой по счёту человек пришёл и дал в сумме 120 рукопожатий. Не вдаваясь в математические подробности, сразу скажем, что формула треугольных чисел может быть сведена к вот такому квадратному уравнению:
n² + n - 2T = 0.
Мы знаем, что у нас по условию Т = 120. Подставим это число в уравнение:
n² + n - 2 × 120 = 0 → n² + n - 240 = 0.
Применим знания из 7 класса школьной программы по математике и решим его:
n1 = -16 и n2 = 15.
Так как количество человек на встрече не может быть отрицательным, то вариант -16 нам не подходит. Остаётся 15, но так как наша последовательность сдвинута на единицу (потому что первый человек не пожимает руки никому, а отсчёт начинается со второго пришедшего), то мы прибавляем к 15 единицу и получаем 16 — это и будет правильный ответ.
Представьте, что вы не знаете про треугольные числа, но умеете программировать и организовывать циклы. Этого вполне достаточно для того, чтобы решить эту задачу.
Общее правило такое: каждый, кто приходит, делает на одно рукопожатие меньше, чем его собственный порядковый номер. Получится, что первый пожмёт руки 0 раз (1 - 1 = 0), второй — 1 раз (2 - 1 = 1) и так далее. И с каждым входящим мы будем эти рукопожатия складывать с остальными. Осталось написать программу. Как всегда в этих случаях, проще всего использовать JavaScript. Код, который будет ниже, можно вставить в консоль прямо на этой странице (Cmd + Alt + I) и получить нужный результат:
// переменные для подсчёта людей и общего количества рукопожатий
var count, handshake;
// в самом начале был один начальник транспортного цеха…
count = 1;
// ...который руку никому не пожал
handshake = 0;
// пока количество рукопожатий не станет равно 120 — выполняем цикл
while (handshake != 120) {
//добавляем нового участника совещания
count += 1;
// считаем, сколько раз он пожмёт руки всем, кто уже присутствует
handshake += (count - 1);
}
// выводим итоговое количество присутствующих
alert('Всего пришло ' + count + ' человек.')
В итоге за нас всю работу сделала программа, и ни одной формулы не задействовано.
Иногда можно решить задачу простым перебором, возложив всю механическую работу на машину.