Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному - Free Pascal
Формулировка задачи:
Формат входных данных
В первой строке входных данных содержатся числа N и K (0<N,K<100001 ). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2109.
Формат выходных данных
Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.
Написал программу, но она не работает. Подскажите, что в ней нужно поменять?
program a2; var n,k,l,m,r,i:longint; a,b:array[1..300000] of longint; begin assign(input,'input.txt'); reset(input); assign(output,'output.txt'); rewrite(output); read(n,k); readln; for i:=1 to n do read(a[i]); readln; for i:=1 to k do read(b[i]); for i:=1 to k do begin l:=0; r:=n+1; while l<r-1 do begin m:=l+(r-l) div 2; if a[m]<b[i] then l:=m else r:=m; end; if a[r]=b[i] then writeln(a[r]); end; end.
26 строчку много раз менял по-разному, но программа либо выдавал ошибку, либо просто неправильный ответ.
Решение задачи: «Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному»
textual
Листинг программы
uses crt; const n=5; k=4; a:array[1..n] of integer=(1,4,5,8,10); b:array[1..k] of integer=(5,6,1,9); var i,j,l,r,m:integer; begin clrscr; for i:=1 to n do write(a[i]:3); writeln; for i:=1 to k do write(b[i]:3); writeln; for i:=1 to k do begin l:=1; r:=n; for j:=1 to n do begin m:=(l+r) div 2; if a[m]>b[i] then r:=m else l:=m; end; if l<>r then begin if abs(a[r]-b[i])<abs(a[l]-b[i]) then writeln(a[r]) else writeln(a[l]); end else writeln(a[l]) end; readln end.
Объяснение кода листинга программы
- Объявлены константы: n=5, k=4.
- Объявлены массивы: a[1..n] и b[1..k].
- Объявлены переменные: i, j, l, r, m.
- Задана инициализация массива a.
- Задана инициализация массива b.
- В цикле выводятся элементы массива a.
- В цикле выводятся элементы массива b.
- Задана инициализация переменных l и r.
- В цикле находим середину массива a и сравниваем a[m] с b[i].
- Если a[m] больше b[i], то обновляем значение переменной r.
- Если a[m] меньше или равно b[i], то обновляем значение переменной l.
- Если l не равно r, то в цикле сравниваем разницу между a[r] и b[i] и разницу между a[l] и b[i].
- Если abs(a[r]-b[i]) меньше abs(a[l]-b[i]), то выводим a[r].
- Если abs(a[r]-b[i]) больше или равно abs(a[l]-b[i]), то выводим a[l].
- Если l равно r, то выводим a[l].
- Задана инициализация переменной m.
- Задана инициализация переменной i.
- Задана инициализация переменной j.
- Задана инициализация переменной n.
- Задана инициализация переменной k.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д