#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int
binarySearch(
int
ar2[],
int
left,
int
right,
int
x)
{
if
(left > right)
return
left - 1;
int
mid = (left + right) / 2;
if
(ar2[mid] == x)
return
mid;
else
if
(ar2[mid] > x)
return
binarySearch(ar2, left, mid - 1, x);
else
return
binarySearch(ar2, mid + 1, right, x);
}
void
printClosest(
int
ar1[],
int
ar2[],
int
m,
int
n,
int
x)
{
int
diff = INT_MAX;
int
res_l, res_r;
int
l = 0, r = n - 1;
while
(l < m && r >= 0) {
if
(
abs
(ar1[l] + ar2[r] - x) < diff) {
res_l = l;
res_r = r;
diff =
abs
(ar1[l] + ar2[r] - x);
}
if
(ar1[l] + ar2[r] > x)
r--;
else
l++;
}
printf
(
"The closest pair is [%d, %d]\n"
, ar1[res_l],
ar2[res_r]);
}
int
main()
{
int
ar1[] = { 1, 4, 5, 7 };
int
ar2[] = { 10, 20, 30, 40 };
int
m =
sizeof
(ar1) /
sizeof
(ar1[0]);
int
n =
sizeof
(ar2) /
sizeof
(ar2[0]);
int
x = 38;
for
(
int
i = 0; i < m; i++) {
int
index = binarySearch(ar2, 0, n - 1, x - ar1[i]);
if
(index >= 0 && index < n
&&
abs
(ar1[i] + ar2[index] - x)
<
abs
(ar1[i] + ar2[index - 1] - x)) {
printClosest(ar1, ar2, m, n, x);
return
0;
}
else
if
(index > 0
&&
abs
(ar1[i] + ar2[index - 1] - x)
<
abs
(ar1[i] + ar2[index] - x)) {
index--;
}
}
return
0;
}