Given an array of non negative integers and a number x, find a pair in array whose product is closest to x.

**Examples :**

Input : arr[] = [2, 3, 5, 9] x = 47 Output : {5, 9} Input : arr[] = [2, 3, 5, 9] x = 8 Output : {2, 5}

**Method 1**

A simple solution is to consider every pair and keep track of closest pair (absolute difference between pair product and x is minimum). Finally print the closest pair. Time complexity of this solution is O()

**Method 2 O(n Log n)**

- Sort the array
- Initialize a variable diff as infinite (Diff is used to store the difference between pair and x). We need to find the minimum diff.
- Traverse the array and for each i, do the following :
- Find the lower bound for x/arr[i] in the sub array on right of arr[i], i.e., in sub array arr[i+1..n-1]. Let it be denoted be l.
- Find the upper bound for x/arr[i] in the sub array on right of arr[i], i.e., in sub array arr[i+1..n-1]. Let it be denoted be u.
- If min(abs((arr[i] * l) – x), abs((arr[i] * u) – x)) < diff then update diff and result

**Method 3 O(n for sorted )**

An efficient solution can find the pair in O(n) time. Following is detailed algorithm.

1) Initialize a variable diff as infinite (Diff is used to store the difference between pair and x). We need to find the minimum diff. 2) Initialize two index variables l and r in the given sorted array. (a) Initialize first to the leftmost index: l = 0 (b) Initialize second the rightmost index: r = n-1 3) Loop while l < r. (a) If abs((arr[l] * arr[r]) - x) < diff then update diff and result (b) Else if((arr[l] * arr[r]) < x) then l++ (c) Else r--

Following is the implementation of above algorithm.

## C++

// Simple C++ program to find the pair with // product closest to a given no. #include <bits/stdc++.h> using namespace std; // Prints the pair with product closest to x void printClosest(int arr[], int n, int x) { int res_l, res_r; // To store indexes of result pair // Initialize left and right indexes and // difference between pair product and x int l = 0, r = n - 1, diff = INT_MAX; // While there are elements between l and r while (r > l) { // Check if this pair is closer than // the closest pair so far if (abs(arr[l] * arr[r] - x) < diff) { res_l = l; res_r = r; diff = abs(arr[l] * arr[r] - x); } // If this pair has more product, // move to smaller values. if (arr[l] * arr[r] > x) r--; else // Move to larger values l++; } cout << " The closest pair is " << arr[res_l] << " and " << arr[res_r]; } // Driver program to test above functions int main() { int arr[] = { 2, 3, 5, 9 }, x = 8; int n = sizeof(arr) / sizeof(arr[0]); printClosest(arr, n, x); return 0; }

## Java

// Simple Java program to find // the pair with product closest // to a given no. import java.io.*; class GFG { // Prints the pair with // product closest to x static void printClosest(int arr[], int n, int x) { // To store indexes of result pair int res_l = 0, res_r = 0; // Initialize left and right // indexes and difference // between pair product and x int l = 0, r = n - 1, diff = Integer.MAX_VALUE; // While there are // elements between l and r while (r > l) { // Check if this pair is closer // than the closest pair so far if (Math.abs(arr[l] * arr[r] - x) < diff) { res_l = l; res_r = r; diff = Math.abs(arr[l] * arr[r] - x); } // If this pair has more product, // move to smaller values. if (arr[l] * arr[r] > x) r--; // Move to larger values else l++; } System.out.print("The closest pair is "); System.out.print (arr[res_l] + " and " + arr[res_r]); } // Driver Code public static void main (String[] args) { int arr[] = {2, 3, 5, 9}; int x = 8; int n = arr.length; printClosest(arr, n, x); } } // This code is contributed by anuj_67.

## C#

// Simple C# program to find // the pair with product closest // to a given no. using System; class GFG { // Prints the pair with // product closest to x static void printClosest(int []arr, int n, int x) { // To store indexes of result pair int res_l = 0, res_r = 0; // Initialize left and right // indexes and difference // between pair product and x int l = 0, r = n - 1, diff = int.MaxValue; // While there are // elements between l and r while (r > l) { // Check if this pair is closer // than the closest pair so far if (Math.Abs(arr[l] * arr[r] - x) < diff) { res_l = l; res_r = r; diff = Math.Abs(arr[l] * arr[r] - x); } // If this pair has more product, // move to smaller values. if (arr[l] * arr[r] > x) r--; // Move to larger values else l++; } Console.Write("The closest pair is "); Console.Write (arr[res_l] + " and " + arr[res_r]); } // Driver Code public static void Main () { int []arr = {2, 3, 5, 9}; int x = 8; int n = arr.Length; printClosest(arr, n, x); } } // This code is contributed by anuj_67.

## PHP

<?php // Simple PHP program to find // the pair with product closest // to a given no. // Prints the pair with // product closest to x function printClosest($arr, $n, $x) { // To store indexes // of result pair $res_l; $res_r; // Initialize left and right // indexes and difference // between pair product and x $l = 0; $r = $n - 1; $diff = PHP_INT_MAX; // While there are elements // between l and r while ($r > $l) { // Check if this pair is // closer than the closest // pair so far if (abs($arr[$l] * $arr[$r] - $x) < $diff) { $res_l = $l; $res_r = $r; $diff = abs($arr[$l] * $arr[$r] - $x); } // If this pair has more // product, move to smaller // values. if ($arr[$l] * $arr[$r] > $x) $r--; // Move to larger values else $l++; } echo " The closest pair is " , $arr[$res_l] , " and " , $arr[$res_r]; } // Driver Code $arr = array(2, 3, 5, 9); $x = 8; $n = count($arr); printClosest($arr, $n, $x); // This code is contributed by anuj_67. ?>

**Output :**

The closest pair is 2 and 5

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.