Related Articles

Related Articles

Find the GCD that lies in given range
  • Difficulty Level : Easy
  • Last Updated : 26 Sep, 2018

Given two positive integer a and b and a range [low, high]. The task is to find the gretest common divisor of a and b which lie in the given range. If no divisor exist in the range, print -1.

Examples:

Input : a = 9, b = 27, low = 1, high = 5
Output : 3
3 is the highest number that lies in range 
[1, 5] and is common divisor of 9 and 27.

Input : a = 9, b = 27, low = 10, high = 11
Output : -1

The idea is to find the Greatest Common Divisor GCD(a, b) of a and b. Now observe, divisor of GCD(a, b) is also the divisor of a and b. So, we will iterate a loop i from 1 to sqrt(GCD(a, b)) and check if i divides GCD(a, b). Also, observe if i is divisor of GCD(a, b) then GCD(a, b)/i will also be divisor. So, for each iteration, if i divides GCD(a, b), we will find maximimum of i and GCD(a, b)/i if they lie in the range.

Below is the implementation of this approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP Program to find the Greatest Common divisor
// of two number which is in given range
#include <bits/stdc++.h>
using namespace std;
  
// Return the greatest common divisor
// of two numbers
int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
  
// Return the gretest common divisor of a
// and b which lie in the given range.
int maxDivisorRange(int a, int b, int l, int h)
{
    int g = gcd(a, b);
    int res = -1;
  
    // Loop from 1 to sqrt(GCD(a, b).
    for (int i = l; i * i <= g && i <= h; i++) 
  
        // if i divides the GCD(a, b), then 
        // find maximum of three numbers res,
        // i and g/i
        if (g % i == 0)
            res = max({res, i, g / i});
      
    return res;
}
  
// Driven Program
int main()
{
    int a = 3, b = 27, l = 1, h = 5;
    cout << maxDivisorRange(a, b, l, h) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to find the Greatest Common
// divisor of two number which is in given
// range
import java.io.*;
  
class GFG {
      
    // Return the greatest common divisor
    // of two numbers
    static int gcd(int a, int b)
    {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
      
    // Return the gretest common divisor of a
    // and b which lie in the given range.
    static int maxDivisorRange(int a, int b, 
                                   int l, int h)
    {
        int g = gcd(a, b);
        int res = -1;
      
        // Loop from 1 to sqrt(GCD(a, b).
        for (int i = l; i * i <= g && i <= h; i++) 
      
            // if i divides the GCD(a, b), then 
            // find maximum of three numbers res,
            // i and g/i
            if (g % i == 0)
                res = Math.max(res,
                             Math.max(i, g / i));
          
        return res;
    }
      
    // Driven Program
    public static void main (String[] args) 
    {
        int a = 3, b = 27, l = 1, h = 5;
        System.out.println( 
             maxDivisorRange(a, b, l, h));
    }
}
  
// This code is contributed by anuj_67.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 Program to find the 
# Greatest Common divisor
# of two number which is 
# in given range
  
  
# Return the greatest common 
# divisor of two numbers
def gcd(a, b):
    if(b == 0):
        return a;
    return gcd(b, a % b);
  
# Return the gretest common 
# divisor of a and b which
# lie in the given range.
def maxDivisorRange(a, b, l, h):
    g = gcd(a, b);
    res = -1;
    # Loop from 1 to
    # sqrt(GCD(a, b).
    i = l;
    while(i * i <= g and i <= h):
        # if i divides the GCD(a, b),
        # then find maximum of three
        # numbers res, i and g/i
        if(g % i == 0):
            res = max(res,max(i, g/i));
        i+=1;
    return int(res);
  
# Driver Code
if __name__ == "__main__":
    a = 3
    b = 27
    l = 1
    h = 5;
  
    print(maxDivisorRange(a, b, l, h));
  
# This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to find the Greatest Common
// divisor of two number which is in given
// range
using System;
  
class GFG {
      
    // Return the greatest common divisor
    // of two numbers
    static int gcd(int a, int b)
    {
        if (b == 0)
            return a;
        return gcd(b, a % b);
    }
      
    // Return the gretest common divisor of a
    // and b which lie in the given range.
    static int maxDivisorRange(int a, int b, 
                                int l, int h)
    {
        int g = gcd(a, b);
        int res = -1;
      
        // Loop from 1 to sqrt(GCD(a, b).
        for (int i = l; i * i <= g && i <= h; i++) 
      
            // if i divides the GCD(a, b), then 
            // find maximum of three numbers res,
            // i and g/i
            if (g % i == 0)
                res = Math.Max(res,
                            Math.Max(i, g / i));
          
        return res;
    }
      
    // Driven Program
    public static void Main () 
    {
        int a = 3, b = 27, l = 1, h = 5;
        Console.WriteLine( 
            maxDivisorRange(a, b, l, h));
    }
}
  
// This code is contributed by anuj_67.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to find the 
// Greatest Common divisor
// of two number which is 
// in given range
  
  
// Return the greatest common 
// divisor of two numbers
function gcd($a, $b)
{
    if ($b == 0)
        return $a;
    return gcd($b, $a % $b);
}
  
// Return the gretest common 
// divisor of a and b which
// lie in the given range.
function maxDivisorRange($a, $b
                         $l, $h)
{
    $g = gcd($a, $b);
    $res = -1;
  
    // Loop from 1 to
    // sqrt(GCD(a, b).
    for ($i = $l; $i * $i <= $g and 
                  $i <= $h; $i++) 
  
        // if i divides the GCD(a, b), 
        // then find maximum of three
        // numbers res, i and g/i
        if ($g % $i == 0)
            $res = max($res
                   max($i, $g / $i));
      
    return $res;
}
  
// Driver Code
$a = 3; $b = 27; 
$l = 1; $h = 5;
  
echo maxDivisorRange($a, $b, $l, $h);
  
// This code is contributed by anuj_67.
?>

chevron_right


Output:

3

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :