Как угадать число от 0 до 100 или математический фокус
Интересный математический фокус, который только на первый взгляд может показаться сложным, но на самом деле это не так!
Условие:
- Необходимо загадать любое число от 0 до 100.
- Перед вами появляется целое число, выданное программой и соответствующее диапазону.
- Вам необходимо указать – предложенное число больше, меньше или равно тому, что вы загадали.
- Если программа не угадала – она продолжит предлагать числа.
- Менее чем за 7 попыток искомое число программа все же сгенерирует.
Решение.
Для получения ответа достаточно просто воспользоваться алгоритмом бинарного поиска. То есть, чтобы найти искомое число, следует каждый раз осуществлять деление оставшегося диапазона на 2. Тем самым мы сокращаем объем поиска при каждом проведении действия. Вот и все – правильный ответ всегда будет найден.
Например, первым программа предложит число 50, мы выбираем один из возможных диапазонов, больше 50 – 51-100 или меньше 0-49. Если вариант меньше – следующим числом скорее всего будет 25. Действия будут повторяться, и искомое число наконец найдется.
Согласно законам математики, при делении числа 100 на 2 в течение 7 раз – результат будет порядка 1.
Но так как 2 в седьмой степени – это 128, диапазон может быть увеличен и иметь вид от 1 до 128 или от 0 до 127. А при увеличении возможных попыток, например, до 8, диапазон также может вырасти до 256 и так далее.
Больше интересных новостей

Нахождение средней зарплаты

Вращающийся диск: задачка на логику для программистов

Разработать план эвакуации жителей Сан-Франциско

Задача от Apple про кассира-программиста
Комментарии (1)
Томеус 03 мая 2023 в 09:24
Угадать число от 0 до 100 за 7 попыток — математический трюк
Математический фокус, который способен удивить. Объясним алгоритм и напишем на Java простенькую программу для решения.
Этот математический фокус не так сложен, как может показаться на первый взгляд. Более того, решение мы реализуем программно на языке 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.
Для начала определимся с переменными, которые нам потребуются:
//заданные границы: int min = 0; int max = 100; //середина области: int midrange = Math.round((min + max) / 2); //строка для работы с терминалом: String strInput = "";
Поскольку мы будем работать с терминалом, подключим слушатель событий с помощью класса Scanner:
import java.util.Scanner;
И объявим переменную слушателя:
Scanner scan = new Scanner(System.in);
Далее всё просто: программа выводит варианты, а пользователь отправляет + , — или = , в зависимости от того, больше загаданное число, меньше или идентично. Пока введённое значение не = ( while (!strInput.equals(«=»)) ), продолжаем вычислять и делить заданный диапазон:
import java.util.Scanner; public class Main < public static void main(String[] args) < int min = 0; int max = 100; int midrange = Math.round((min + max) / 2); String strInput = ""; Scanner scan = new Scanner(System.in); System.out.println("Загадайте число от 0 до 100: я угадаю его за 7 попыток!\n" + "Чтобы продолжить, введите любое значение:"); strInput = scan.nextLine(); while (!strInput.equals("=")) < System.out.println("Это число больше, меньше или равно " + midrange + "? " + "Введите '+' если больше, '-' если меньше и '=' если равно:"); strInput = scan.nextLine(); if (strInput.equals("=")) < System.out.println("Отлично! Ваше число " + midrange + ". Спасибо за игру ;)"); break; >else if (strInput.equals("+")) < //уменьшаем диапазон: min = midrange; //находим новую середину диапазона: midrange = Math.round((min + max) / 2); //если округление сравнило середину с нижней границей, увеличиваем середину на 1: if (min == midrange && midrange!=100) < midrange += 1; >> else if (strInput.equals("-")) < max = midrange; midrange = Math.round((min + max) / 2); >> > >
Понравилась задачка? Держите ещё один математический фокус в виде гипотезы Коллатца.
Как угадать число от 1 до 100 за 7 попыток



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Как угадать число от 0 до 100 за 7 попыток?
— Спорим, я угадаю его за 7 попыток или быстрее? Я буду называть числа, а ты — отвечать, оно больше, меньше или равно загаданному.
— Ахахах, ты не сможешь угадать за 7 попыток!
— Ну давай, покажи своё кунфу…
6 попыток спустя отец угадал число, а ребёнок сидит в шоке. Они попробовали снова, и во второй раз отец угадал число за семь попыток. В третий — за четыре. Сколько бы они ни играли, число всегда угадывалось за 7 попыток или менее.
Это простейшая алгоритмическая задача, которую показывают на первом уроке информатики, чтобы показать мощь алгоритмического мышления. Смысл в том, чтобы.
каждый раз называть число, которое делит пополам диапазон возможных чисел.
Этот приём каждый раз в 2 раза сокращает область поиска, и в конце нам становится легко угадать даже простым перебором.
Допустим, сын загадал число 63. Тогда делаем так:
- Находим середину диапазона от 0 до 100 — это 50. Называем это число. Сын говорит «Больше».
- Значит, его число лежит в диапазоне от 50 до 100. Находим его середину — 75. Называем это число. Сын говорит «Меньше».
- Ага, значит, его число находится в диапазоне от 50 до 75. Находим середину — 62. Называем это число. Сын говорит «Больше».
- Поиск снова сузился: от 62 до 75. Середина — 67. Называем это число. Сын говорит «Меньше».
- У нас осталось 3 попытки и 4 числа. Найдём ещё одну середину — 64. Называем это число. Сын говорит «Меньше».
- Раз у нас число, которое больше, чем 62, и меньше, чем 64, то это число 63. Даже седьмая попытка не понадобилась.
Этим способом можно угадать любое число от 0 до 100 за 7 попыток или меньше. Главное — быстро и правильно считать в уме середину и помнить, как выглядит сейчас твой рабочий диапазон.
А если число будет больше?
На самом деле за 7 шагов можно угадать любое число от 0 до 127 или от 1 до 128. Всё потому, что два в седьмой степени — это как раз 128. Каждый раз, когда мы делим рабочий диапазон на 2, мы как будто убираем одну степень у двойки, постепенно уменьшая наш диапазон угадывания до двух чисел. Для верности лучше добавить ещё попытку.
Если бы у нас было 8 попыток, можно было бы угадывать числа до 256. 9 попыток — 512 и так далее.
А где это используется в народном хозяйстве?
На этом принципе построена модель данных «Бинарное дерево» — это одна из важнейших технологий для составления словарей и поиска данных. Прочитайте об этом в статье про бинарные деревья.
