Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Формат входных данных В первой строке входных данных содержатся числа N и K (0<N,K<100001 ). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2109. Формат выходных данных Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них. Написал программу, но она не работает. Подскажите, что в ней нужно поменять?
Листинг программы
  1. program a2;
  2. var n,k,l,m,r,i:longint;
  3. a,b:array[1..300000] of longint;
  4. begin
  5. assign(input,'input.txt');
  6. reset(input);
  7. assign(output,'output.txt');
  8. rewrite(output);
  9. read(n,k);
  10. readln;
  11. for i:=1 to n do
  12. read(a[i]);
  13. readln;
  14. for i:=1 to k do
  15. read(b[i]);
  16. for i:=1 to k do
  17. begin
  18. l:=0;
  19. r:=n+1;
  20. while l<r-1 do
  21. begin
  22. m:=l+(r-l) div 2;
  23. if a[m]<b[i] then l:=m
  24. else r:=m;
  25. end;
  26. if a[r]=b[i] then writeln(a[r]);
  27. end;
  28. end.
26 строчку много раз менял по-разному, но программа либо выдавал ошибку, либо просто неправильный ответ.

Решение задачи: «Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному»

textual
Листинг программы
  1. uses crt;
  2. const n=5;
  3.       k=4;
  4.       a:array[1..n] of integer=(1,4,5,8,10);
  5.       b:array[1..k] of integer=(5,6,1,9);
  6. var i,j,l,r,m:integer;
  7. begin
  8. clrscr;
  9. for i:=1 to n do
  10. write(a[i]:3);
  11. writeln;
  12. for i:=1 to k do
  13. write(b[i]:3);
  14. writeln;
  15. for i:=1 to k do
  16.  begin
  17.   l:=1;
  18.   r:=n;
  19.   for j:=1 to n do
  20.    begin
  21.     m:=(l+r) div 2;
  22.     if a[m]>b[i] then r:=m else l:=m;
  23.    end;
  24.     if l<>r then
  25.      begin
  26.       if abs(a[r]-b[i])<abs(a[l]-b[i]) then writeln(a[r])
  27.       else writeln(a[l]);
  28.      end
  29.     else writeln(a[l])
  30.  end;
  31. readln
  32. end.

Объяснение кода листинга программы

  1. Объявлены константы: n=5, k=4.
  2. Объявлены массивы: a[1..n] и b[1..k].
  3. Объявлены переменные: i, j, l, r, m.
  4. Задана инициализация массива a.
  5. Задана инициализация массива b.
  6. В цикле выводятся элементы массива a.
  7. В цикле выводятся элементы массива b.
  8. Задана инициализация переменных l и r.
  9. В цикле находим середину массива a и сравниваем a[m] с b[i].
  10. Если a[m] больше b[i], то обновляем значение переменной r.
  11. Если a[m] меньше или равно b[i], то обновляем значение переменной l.
  12. Если l не равно r, то в цикле сравниваем разницу между a[r] и b[i] и разницу между a[l] и b[i].
  13. Если abs(a[r]-b[i]) меньше abs(a[l]-b[i]), то выводим a[r].
  14. Если abs(a[r]-b[i]) больше или равно abs(a[l]-b[i]), то выводим a[l].
  15. Если l равно r, то выводим a[l].
  16. Задана инициализация переменной m.
  17. Задана инициализация переменной i.
  18. Задана инициализация переменной j.
  19. Задана инициализация переменной n.
  20. Задана инициализация переменной k.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы