Страница 1 из 1

"Деление массива пополам"

Добавлено: 20 янв 2008, 13:47
somebody_now
Дана последовательность по возрастанию (а1..а15) и число B. Методом "деления пополам" определить номер элемента, численное значение которого совпадает с B.
Имеется следующий алгоритм:

Код: Выделить всё

const n=15;
var b,i:integer;
a:array[1..n] of integer;
begin
readln(b);
for i:=1 to n do readln(a[i]);
[B]i:=10;[/B]
while a[i]<>b do
if a[i]<b then i:=i/2 else i:=i+i/2;
writeln(i);
end.
Как-то на протяжении семестра записал его, теперь возник вопрос:
почему перед первой проверкой совпадения a и b устанавливаем i именно на 10?
да и вообще у меня большие сомнения в правильности написания алгоритма..

Re: "Деление массива пополам"

Добавлено: 21 янв 2008, 11:33
Хыиуду
Во-первых, если последовательность возрастает, то условие if a<b надо менять на противоположное. А во-вторых, с i=10 работать-то будет, но алгоритмически предпочтительней (и логичнее) взять i=7 или 8.
Оператор i:=i+i/2; тоже неверен, здесь надо i+(n-i)/2, округлять вверх

Re: "Деление массива пополам"

Добавлено: 22 янв 2008, 12:48
Albor
И условие последнего цикла нужно менять ( а вдруг, В не равен ни одному элементу массива?) .

Re: "Деление массива пополам"

Добавлено: 22 янв 2008, 14:22
somebody_now
Хыиуду, спасибо, разобрался)
Albor, в условии подразумевалось, что такой элемент в массиве обязательно присутствует.