Напишите программу, которая отгадывает загаданное целое число от 1 до 1000 (пользователь или тестирующая система загадывает число в уме и не сообщает программе). Угадать число нужно не более чем за 10 попыток. На каждую попытку пользователь отвечает, что загаданное число больше названного (вводит символ ">"), меньше названного ("<") или угадано правильно ("="). Используйте бинарный поиск. Ваша программа должна каждый раз называть число, находящееся посередине исследуемого диапазона — в результате станет ясно, в какой половине диапазона находится искомое число.
Например, для диапазона от 1 до 8 (а не до 1000) это могло бы выглядеть так (загадано число 5):
4 (программа пробует угадать, называя число из середины интервала от 1 до 8)
> (пользователь отвечает, что загаданное число больше введенного; теперь программа ищет в интервале от 5 до 8)
6
<
5
=
2 1 6 2 10 3 14 4 18 5
Объяснение:
n = 1
n - чётное (НЕТ)
y = 2 * 1 = 2
Вывод на экран: 2
n = 1 + 1 = 2
2 <= 10 (ДА)
n = 2
n - чётное (ДА)
y = 2 / 2 = 1
Вывод на экран: 1
n = 2 + 1 = 3
3 <= 10 (ДА)
n = 3
n - чётное (НЕТ)
y = 2 * 3 = 6
Вывод на экран: 6
n = 3 + 1 = 4
4 <= 10 (ДА)
n = 4
n - чётное (ДА)
y = 4 / 2 = 2
Вывод на экран: 2
n = 4 + 1 = 5
5 <= 10 (ДА)
n = 5
n - чётное (НЕТ)
y = 2 * 5 = 10
Вывод на экран: 10
n = 5 + 1 = 6
6 <= 10 (ДА)
n = 6
n - чётное (ДА)
y = 6 / 2 = 3
Вывод на экран: 3
n = 6 + 1 = 7
7 <= 10 (ДА)
n = 7
n - чётное (НЕТ)
y = 2 * 7 = 14
Вывод на экран: 14
n = 7 + 1 = 8
8 <= 10 (ДА)
n = 8
n - чётное (ДА)
y = 8 / 2 = 4
Вывод на экран: 4
n = 8 + 1 = 9
9 <= 10 (ДА)
n = 9
n - чётное (НЕТ)
y = 2 * 9 = 18
Вывод на экран: 18
n = 9 + 1 = 10
10 <= 10 (ДА)
n = 10
n - чётное (ДА)
y = 10 / 2 = 5
Вывод на экран: 5
n = 10 + 1 = 11
11 <= 10 (НЕТ)
Новые возможности, которые добавляют разработчики, позволяют вообще написать одну строчку:
Код (PascalABC.NET):
## ArrRandomInteger(13).Println.Average.Print;
## говорит о том, что компилятор добавит в начало и конец begin и end.
ArrRandomInteger(13) - функция, генерирующая массив из 13 случайных целых чисел
Println - метод расширения, выводящий элементы через пробел и в конце переходящий на новую строку
Average - метод, вычисляющий среднее значение
Print - вывод значения на экран
В стиле "старого" паскаля:
Код (PascalABC.NET):
var
a: array[1..13] of integer;
s, i: integer;
begin
randomize;
s := 0;
for i := 1 to 13 do
begin
a[i] := random(100);
write(a[i], ' ');
s := s + a[i];
end;
writeln;
write(s / 13);
end.
Пример вывода:
38 86 86 0 24 95 51 41 32 18 74 15 55
47.3076923076923