М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
Sofja007
Sofja007
09.04.2021 09:08 •  Информатика

Андрей недавно выучил алгоритм бинарного поиска. этот алгоритм предназначен для поиска числа в отсортированном массиве чисел. к сожалению, андрей правильно уловил идею, но не до конца запомнил детали того, как нужно реализовывать этот алгоритм. реализация андрея работает следующим образом: поддерживается отрезок, на котором осуществляется поиск (изначально – весь массив) следующие действия повторяются до тех пор, пока элемент не будет найден или отрезок не станет иметь нулевую длину: выбирается элемент, находящийся в середине отрезка если элемент равен искомому числу, алгоритм завершается если элемент больше, чем искомое число, от отрезка оставляется только левая часть (та, что левее середины) если элемент меньше, чем искомое число, от отрезка оставляется только правая часть (та, что правее середины) учитель андрея по информатике заметил, что реализация андрея может выполнить разное количество итераций, в зависимости от того, на какой позиции находится искомое число, в то время как правильная реализация всегда работает за одинаковое количество итераций. теперь андрей хочет узнать, сколько итераций сделает его алгоритм в следующих условиях: массив заполнен 65535 числами от 0 до 65534, каждое число встречается один раз числа по возрастанию искомое число – 3001

👇
Ответ:
Matka2002
Matka2002
09.04.2021
Выполняя алгоритм, получаем следующий результат (15 итераций)

1. 0..65534 -> 32767
2. 0..32766 -> 16383
3. 0..16382 -> 8191
4. 0..8190  -> 4095
5. 0..4094  -> 2047
6. 2048..4094 -> 3071
7. 2048..3070 -> 2559
8. 2560..3070 -> 2815
9. 2816..3070 -> 2943
10. 2944..3070 -> 3007
11. 2944..3006 -> 2975
12. 2976..3006 -> 2991
13. 2992..3006 -> 2999
14. 3000..3006 -> 3003
15. 3000..3002 -> 3001

Если лень перебирать вручную, можно воспользоваться программой

var k,l,r,x,f:integer;
begin
f := 3001;
l := 0;
r := 65534;
x := (l + r) div 2;
k := 1;
while (x <> f) and (l < r) do
  begin
  writeln(k,' ',l,' ',r,' ',x);
  k := k + 1;
  if f < x then r := x - 1
    else l := x + 1;
  x := (l + r) div 2
  end;
writeln(k,' ',l,' ',r,' ',x);
end.
4,8(9 оценок)
Открыть все ответы
Ответ:
davidegorov19
davidegorov19
09.04.2021
Вот задача для "троечников" с дополнительной оценкой:

program pr1;
uses
crt;

const
arr1 : array[1..12] of integer = (5, 4, -3, 1, 0, -4, 0, 25, -8, 0, -17, -1);

type
arr2 = array of integer;

var
arr : arr2;
n : integer;
i, sot, spl, snu : byte;
ch : char;

begin
write('Хотите использовать заданный по умолчанию массив? (y/n): ');
ch := readkey;
writeln(ch);
sot := 0;
spl := 0;
snu := 0;
if ((ch='y') or (ch='Y')) then begin
{ Используем заданный по умолчанию }
for i:=1 to 12 do begin
if arr1[i] > 0 then inc(spl);
if arr1[i] < 0 then inc(sot);
if arr1[i] = 0 then inc(snu);
write(arr1[i], ' ');
end;
writeln;
end
else begin
{ Создаём и заполняем новый массив }
write('Введите желаемый размер массива: ');
readln(n);
setLength(arr, n);
writeln('Введите элементы массива:');
for i:=0 to high(arr) do
readln(arr[i]);
for i:=0 to high(arr) do begin
if arr[i]>0 then inc(spl);
if arr[i]<0 then inc(sot);
if arr[i]=0 then inc(snu);
write(arr[i], ' ');
end;
writeln;
end;

writeln('Количество отрицательных элементов: ', sot);
writeln('Количество нулевых элементов: ', snu);
writeln('Количество положительных элементов: ', spl);
end.
4,7(85 оценок)
Ответ:
Dashaegor540
Dashaegor540
09.04.2021
Program mm;
var a:array[1..12] of integer;
begin
for i:=1 to 12 do begin
а[1]:=5;
 а[2]:=4;
 а[3]:=-3;
 а[4]:=1;
 а[5]:=0;
а[6]:=-4;
 а[7]:=(у тебя не написано);
 а[8]=25;
 а[9]=-8;
 a[10]=-5;
 а[11]=-17;
 а[12]=-1;
end;
writeln('Вот исходный массив');
for i:=1 to 12 do writeln('A[',i,']=',a[i]); 
for i:=1 to 12 do begin
if (A[i]<0) then a[i]:=1;
if (a[i]>0) then a[i]:=-5;
end;
writeln('Вот полученный массив');
for i:=1 to 12 do writeln('A[',i,']=',a[i]); 
writeln(' Введите 12 чисел');
for i:=1 to 12 do readln(A[i]);          (это доп оценка)
end.
4,6(17 оценок)
Новые ответы от MOGZ: Информатика
Полный доступ к MOGZ
Живи умнее Безлимитный доступ к MOGZ Оформи подписку
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ