Угадать число от 0 до 100 за 7 попыток — математический трюк
Математический фокус, который способен удивить. Объясним алгоритм и напишем на Java простенькую программу для решения.
19К открытий21К показов
Этот математический фокус не так сложен, как может показаться на первый взгляд. Более того, решение мы реализуем программно на языке Java. Приступим?
Условие
Если расписать весь процесс поэтапно, выглядит это следующим образом:
- Вы загадываете число от 0 до 100.
- Программа выводит целое число в рамках данного диапазона.
- Вы отвечаете, ваше число больше, меньше или равно тому, что вывела программа.
- Если число больше либо меньше, программа продолжает предлагать варианты.
- За 7 или менее попыток число гарантированно угадывается.
Решение
На самом деле, никакого особого секрета здесь нет, и решение строится на бинарном поиске. Это простая алгоритмическая задача, смысл которой в том, чтобы каждый раз делить оставшийся диапазон на 2. Таким образом мы с каждой попыткой вдвое сокращаем область поиска, увеличивая шансы на успех. Вот и весь математический фокус.
Допустим, первой догадкой алгоритма будет число 50, после чего становится понятно, в какую сторону исходного диапазона «шагать» дальше: это будет область 0–50 либо 51–100. Если первый вариант, то далее алгоритм предложит число 25 и так далее. Математические законы предполагают, что если число 100 делить вдвое 7 раз, мы гарантированно получим результат в районе единицы.
Можно найти число и в диапазоне побольше — от 0 до 127 или от 1 до 128. Всё потому, что 27=128. Соответственно, если у нас будет 8 попыток, область можно увеличить до 256, если 9 — до 512 и т. д. По этому же принципу работают бинарные деревья.
Но решать всё вручную с калькулятором наперевес — прошлый век. Давайте подключим код и посмотрим, как с этим справится программа.
Решение кодом
Воспроизведём решение с помощью Java без использования графического интерфейса. При желании всегда можно подключить Swing или JavaFX.
Для начала определимся с переменными, которые нам потребуются:
Поскольку мы будем работать с терминалом, подключим слушатель событий с помощью класса Scanner:
И объявим переменную слушателя:
Далее всё просто: программа выводит варианты, а пользователь отправляет +
, -
или =
, в зависимости от того, больше загаданное число, меньше или идентично. Пока введённое значение не =
(while (!strInput.equals("="))
), продолжаем вычислять и делить заданный диапазон:
Понравилась задачка? Держите ещё один математический фокус в виде гипотезы Коллатца.
19К открытий21К показов