# Find the maximum GCD possible for some pair in a given range [L, R]

• Difficulty Level : Expert
• Last Updated : 17 Jan, 2022

Given a range L to R, the task is to find the maximum possible value of GCD(X, Y) such that X and Y belongs to the given range, i.e. L â‰¤ X < Y â‰¤ R.

Examples:

Input: L = 101, R = 139
Output:
34
Explanation:
For X = 102 and Y = 136, the GCD of x and y is 34, which is the maximum possible.

Input: L = 8, R = 14
Output:

Naive Approach: Every pair that can be formed from L to R, can be iterated over using two nested loops and the maximum GCD can be found.

Time Complexity: O((R-L)2Log(R))
Auxiliary Space: O(1)

Efficient Approach: Follow the below steps to solve the problem:

• Let the maximum GCD be Z, therefore, X and Y are both multiples of Z. Conversely if there are two or more multiples of Z in the segment [L, R], then (X, Y) can be chosen such that GCD(x, y) is maximum by choosing consecutive multiples of Z in [L, R].
• Iterate from R to 1 and find whether any of them has at least two multiples in the range [L, R]
• The multiples of Z between L and R can be calculated using the following formula:
• Number of Multiples of Z in [L, R] = Number of multiples of Z in [1, R] – Number of Multiples of Z in [1, L-1]
• This can be written as :
• No. of Multiples of Z in [L, R] = floor(R/Z) – floor((L-1)/Z)
• We can further optimize this by limiting the iteration from R/2 to 1 as the greatest possible GCD is R/2 (with multiples R/2 and R)

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach` `#include ` `using` `namespace` `std;`   `// Function to calculate GCD` `int` `GCD(``int` `a, ``int` `b)` `{` `    ``if` `(b == 0)` `        ``return` `a;` `    ``return` `GCD(b, a % b);` `}`   `// Function to calculate` `// maximum GCD in a range` `int` `maxGCDInRange(``int` `L, ``int` `R)` `{` `    ``// Variable to store the answer` `    ``int` `ans = 1;`   `    ``for` `(``int` `Z = R/2; Z >= 1; Z--) {`   `        ``// If Z has two multiples in [L, R]` `        ``if` `((R / Z) - (L - 1) / Z > 1) {`   `            ``// Update ans` `            ``ans = Z;` `            ``break``;` `        ``}` `    ``}`   `    ``// Return the value` `    ``return` `ans;` `}` `// Driver code` `int` `main()` `{` `    ``// Input` `    ``int` `L = 102;` `    ``int` `R = 139;`   `    ``// Function Call` `    ``cout << maxGCDInRange(L, R);`   `    ``return` `0;` `}`

## Java

 `// Java program for the above approach` `import` `java.io.*;`   `class` `GFG {` `    ``// Function to calculate GCD` `    ``public` `static` `int` `GCD(``int` `a, ``int` `b)` `    ``{` `        ``if` `(b == ``0``)` `            ``return` `a;` `        ``return` `GCD(b, a % b);` `    ``}`   `    ``// Function to calculate` `    ``// maximum GCD in a range` `    ``public` `static` `int` `maxGCDInRange(``int` `L, ``int` `R)` `    ``{` `        ``// Variable to store the answer` `        ``int` `ans = ``1``;`   `        ``for` `(``int` `Z = R/``2``; Z >= ``1``; Z--) {`   `            ``// If Z has two multiples in [L, R]` `            ``if` `((R / Z) - (L - ``1``) / Z > ``1``) {`   `                ``// Update ans` `                ``ans = Z;` `                ``break``;` `            ``}` `        ``}`   `        ``// Return the value` `        ``return` `ans;` `    ``}` `  `  `  ``// Driver code` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``// Input` `        ``int` `L = ``102``;` `        ``int` `R = ``139``;`   `        ``// Function Call` `        ``System.out.println(maxGCDInRange(L, R));` `    ``}`   `  `  `   ``// This code is contributed by Potta Lokesh`

## Python3

 `# Python3 program for the above approach`   `# Function to calculate GCD` `def` `GCD(a, b):` `    `  `    ``if` `(b ``=``=` `0``):` `        ``return` `a` `        `  `    ``return` `GCD(b, a ``%` `b)`   `# Function to calculate` `# maximum GCD in a range` `def` `maxGCDInRange(L, R):` `    `  `    ``# Variable to store the answer` `    ``ans ``=` `1`   `    ``for` `Z ``in` `range``(R``/``/``2``, ``1``, ``-``1``):` `        `  `        ``# If Z has two multiples in [L, R]` `        ``if` `(((R ``/``/` `Z) ``-` `(L ``-` `1``) ``/``/` `Z ) > ``1``):` `            `  `            ``# Update ans` `            ``ans ``=` `Z` `            ``break` `        `  `    ``# Return the value` `    ``return` `ans`   `# Driver code`   `# Input` `L ``=` `102` `R ``=` `139`   `# Function Call` `print``(maxGCDInRange(L, R))`   `# This code is contributed by SoumikMondal`

## C#

 `// C# program for the above approach` `using` `System;`   `class` `GFG{` `    `  `// Function to calculate GCD` `public` `static` `int` `GCD(``int` `a, ``int` `b)` `{` `    ``if` `(b == 0)` `        ``return` `a;` `        `  `    ``return` `GCD(b, a % b);` `}`   `// Function to calculate` `// maximum GCD in a range` `public` `static` `int` `maxGCDInRange(``int` `L, ``int` `R)` `{` `    `  `    ``// Variable to store the answer` `    ``int` `ans = 1;`   `    ``for``(``int` `Z = R/2; Z >= 1; Z--)` `    ``{` `        `  `        ``// If Z has two multiples in [L, R]` `        ``if` `((R / Z) - (L - 1) / Z > 1)` `        ``{` `            `  `            ``// Update ans` `            ``ans = Z;` `            ``break``;` `        ``}` `    ``}`   `    ``// Return the value` `    ``return` `ans;` `}`   `// Driver code` `public` `static` `void` `Main()` `{` `    `  `    ``// Input` `    ``int` `L = 102;` `    ``int` `R = 139;`   `    ``// Function Call` `    ``Console.Write(maxGCDInRange(L, R));` `}` `}`   `// This code is contributed by rishavmahato348`

## Javascript

 ``

Output

`34`

Time Complexity: O(R)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :