Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа угадывания числа
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Shuruper
Всем доброго времени суток.
Хотел бы поинтересоваться можно ли усовершенствовать программу так, чтобы она за меньшее кол-во вопросов угадывала число.
Условие задачи.
Я загадаю число из интервала от А до В (включительно). Напишите программу, которая за минимальное число вопросов отгадает это число. Играть будем так. Я сообщаю программе число от А до В, программа выводит свою версию ответа. Если число меньше задуманного, то я сообщаю программе об этом -1 , если больше, то числом 1, а если число угадано 0.

Мой вариант:

uses crt;
var
a,b:integer;
s:integer;
ans:integer;
ask:integer;
BEGIN
Write('a=');ReadLn(a);
Write('b=');ReadLn(b);
repeat
s:=b-a;
ask:=b-(s div 2);
WriteLn(ask);
ReadLn(ans);
If ans=1 then b:=ask;
If ans=-1 then a:=ask;
until ans=0;
END.

Lapp
Задача во многом (хотя и не полностью) аналогична предложенной Klem4 тут: Задача о двух шариках. Посмотри, может - выудишь что полезное..
мисс_граффити
Shuruper, ты используешь метод половинного деления (т.е. на каждом шаге программа выбирает середину отрезка как версию о загаданном числе).
Можешь еще почитать про метод золотого сечения.

Хотя зависит от того, по какому параметру хочешь оптимизировать программу.
Shuruper
Спасибо за информацию. Будем анализировать.
Archon
Мне кажется, что "Задача о двух шариках" тут не подходит, у нее довольно специфические условия. Золотое сечение тоже не поможет, оно подходит для поисков экстремумов. Вряд-ли в угадайке есть алгоритм оптимальнее бинарного поиска =).

Но программу улучшить можно, и даже нужно. Shuruper, попробуй на отрезке [1, 2] задумать число 1 =).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.