Program to Find GCD or HCF of Two Numbers (original) (raw)

Given two positive integers **a and **b, the task is to find the GCD of the two numbers.

**Note: The GCD (Greatest Common Divisor) or HCF (Highest Common Factor) of two numbers is the largest number that divides both of them.

gcd

**Examples:

**Input: a = 20, b = 28
**Output: 4
**Explanation: The factors of 20 are 1, 2, 4, 5, 10 and 20. The factors of 28 are 1, 2, 4, 7, 14 and 28. Among these factors, 1, 2 and 4 are the common factors of both 20 and 28. The greatest among the common factors is 4.

**Input: a = 60, b = 36
**Output: 12
**Explanation: GCD of 60 and 36 is 12.

Table of Content

[Approach - 1] Using Loop - O(min(a, b)) Time and O(1) Space

The idea is to find the minimum of the two numbers and find its highest factor which is also a factor of the other number.

C++ `

#include using namespace std;

int gcd(int a, int b) { // Everything divides 0 if(a==0 || b==0) return max(a, b);

// Find Minimum of a and b
int result = min(a, b);
while (result > 0) {
    if (a % result == 0 && b % result == 0) {
        break;
    }
    result--;
}

// Return gcd of a and b
return result;

}

int main() { int a = 20, b = 28; cout << gcd(a, b); return 0; }

Java

import java.io.*;

class GFG {

static int gcd(int a, int b)
{
    // Everything divides 0
    if(a==0 || b==0) return Math.max(a, b);
    
    // Find Minimum of a and b
    int result = Math.min(a, b);
    while (result > 0) {
        if (a % result == 0 && b % result == 0) {
            break;
        }
        result--;
    }

    // Return gcd of a and b
    return result;
}

public static void main(String[] args)
{
    int a = 20, b = 28;
    System.out.print(gcd(a, b));
}

}

Python

def gcd(a, b):

# Everything divides 0
if(a==0 or b==0):
    return max(a, b)
    
# Find Minimum of a and b
result = min(a, b)

while result > 0:
    if a % result == 0 and b % result == 0:
        break
    result -= 1

# Return gcd of a and b
return result

if name == 'main': a = 20 b = 28 print(gcd(a, b))

C#

using System;

class GFG {

// Function to find gcd of two numbers
static int gcd(int a, int b) {
    
    // Everything divides 0
    if(a==0 || b==0) return Math.Max(a, b);
    
    // Find Minimum of a and b
    int result = Math.Min(a, b);

    while (result > 0)
    {
        if (a % result == 0 && b % result == 0)
            break;
        result--;
    }

    // Return gcd of a and b
    return result;
}

static void Main()
{
    int a = 20;
    int b = 28;
    Console.WriteLine(gcd(a, b));
}

}

JavaScript

function gcd(a, b) {

// Everything divides 0
if(a==0 || b==0) return Math.max(a, b);

// Find Minimum of a and b
let result = Math.min(a, b);

while (result > 0) {
    if (a % result === 0 && b % result === 0) {
        break;
    }
    result--;
}

// Return gcd of a and b
return result;

}

// Driver Code let a = 20; let b = 28; console.log(gcd(a, b));

`

Below both approaches are optimized approaches of the above code.

[Approach - 2] Euclidean Algorithm using Subtraction - O(min(a,b)) Time and O(min(a,b)) Space

The idea of this algorithm is, the GCD of two numbers doesn't change if the smaller number is subtracted from the bigger number. This is the **Euclidean algorithm by subtraction. It is a process of repeat subtraction, carrying the result forward each time until the result is equal to any one number being subtracted.

**Pseudo-code:

gcd(a, b):
if a = b:
return a
if a > b:
return gcd(a - b, b)
else:
return gcd(a, b - a)

C++ `

#include using namespace std;

int gcd(int a, int b) { // Everything divides 0 if (a == 0) return b; if (b == 0) return a;

// Base case
if (a == b)
    return a;

// a is greater
if (a > b)
    return gcd(a - b, b);
return gcd(a, b - a);

}

int main() { int a = 20, b = 28; cout << gcd(a, b); return 0; }

Java

class GfG {

static int gcd(int a, int b) {
    // Everything divides 0
    if (a == 0)
        return b;
    if (b == 0)
        return a;

    // Base case
    if (a == b)
        return a;

    // a is greater
    if (a > b)
        return gcd(a - b, b);
    return gcd(a, b - a);
}

public static void main(String[] args) {
    int a = 20, b = 28;
    System.out.println(gcd(a, b));
}

}

Python

def gcd(a, b):

# Everything divides 0
if a == 0:
    return b
if b == 0:
    return a

# Base case
if a == b:
    return a

# a is greater
if a > b:
    return gcd(a - b, b)
return gcd(a, b - a)

if name == 'main': a = 20 b = 28 print(gcd(a, b))

C#

using System;

class GfG { static int gcd(int a, int b) { // Everything divides 0 if (a == 0) return b; if (b == 0) return a;

    // Base case
    if (a == b)
        return a;

    // a is greater
    if (a > b)
        return gcd(a - b, b);
    return gcd(a, b - a);
}

static void Main()
{
    int a = 20, b = 28;
    Console.WriteLine(gcd(a, b));
}

}

JavaScript

function gcd(a, b) { // Everything divides 0 if (a === 0) return b; if (b === 0) return a;

// Base case
if (a === b)
    return a;

// a is greater
if (a > b)
    return gcd(a - b, b);
return gcd(a, b - a);

}

// Driver code let a = 20, b = 28; console.log(gcd(a, b));

`

[Approach - 3 ] Modified Euclidean Algorithm using Subtraction byChecking Divisibility - O(min(a, b))Time **and O(min(a, b))Space

The above method can be optimized based on the following idea:

If we notice the previous approach, we can see at some point, one number becomes a factor of the other so instead of repeatedly subtracting till both become equal, we can check if it is a factor of the other.

**Illustration:

See the below illustration for a better understanding:

Consider a = 98 and b = 56

**a = 98, b = 56:

**a = 42, b = 56:

**a = 42, b = 14:

So **HCF is 14.

C++ `

#include using namespace std;

int gcd(int a, int b) { // Everything divides 0 if (a == 0) return b; if (b == 0) return a;

// Base case
if (a == b)
    return a;

// a is greater
if (a > b) {
    if (a % b == 0)
        return b;
    return gcd(a - b, b);
}

// b is greater
if (b % a == 0)
    return a;
return gcd(a, b - a);

}

// Driver code int main() { int a = 20, b = 28; cout << gcd(a, b); return 0; }

Java

class GfG {

static int gcd(int a, int b) {
    // Everything divides 0
    if (a == 0)
        return b;
    if (b == 0)
        return a;

    // Base case
    if (a == b)
        return a;

    // a is greater
    if (a > b) {
        if (a % b == 0)
            return b;
        return gcd(a - b, b);
    }

    // b is greater
    if (b % a == 0)
        return a;
    return gcd(a, b - a);
}

// Driver code
public static void main(String[] args) {
    int a = 20, b = 28;
    System.out.println(gcd(a, b));
}

}

Python

def gcd(a, b): # Everything divides 0 if a == 0: return b if b == 0: return a

# Base case
if a == b:
    return a

# a is greater
if a > b:
    if a % b == 0:
        return b
    return gcd(a - b, b)

# b is greater
if b % a == 0:
    return a
return gcd(a, b - a)

Driver code

if name == 'main': a = 20 b = 28 print(gcd(a, b))

C#

using System;

class GfG { static int gcd(int a, int b) { // Everything divides 0 if (a == 0) return b; if (b == 0) return a;

    // Base case
    if (a == b)
        return a;

    // a is greater
    if (a > b)
    {
        if (a % b == 0)
            return b;
        return gcd(a - b, b);
    }

    // b is greater
    if (b % a == 0)
        return a;
    return gcd(a, b - a);
}

// Driver code
static void Main()
{
    int a = 20, b = 28;
    Console.WriteLine(gcd(a, b));
}

}

JavaScript

function gcd(a, b) { // Everything divides 0 if (a === 0) return b; if (b === 0) return a;

// Base case
if (a === b)
    return a;

// a is greater
if (a > b) {
    if (a % b === 0)
        return b;
    return gcd(a - b, b);
}

// b is greater
if (b % a === 0)
    return a;
return gcd(a, b - a);

}

// Driver code let a = 20, b = 28; console.log(gcd(a, b));

`

[Approach - 4]Optimized EuclideanAlgorithm by Checking Remainder

Instead of the Euclidean algorithm by subtraction, a better approach can be used. We don't perform subtraction here. we continuously divide the bigger number by the smaller number. More can be learned about this **efficient solution by using the modulo operator in Euclidean algorithm.

C++ `

#include using namespace std;

// Recursive function to calculate GCD using Euclidean algorithm int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }

// Driver code int main() { int a = 20, b = 28; cout << gcd(a, b); return 0; }

Java

class GfG {

// Recursive function to calculate GCD using Euclidean algorithm
static int gcd(int a, int b) {
    return (b == 0) ? a : gcd(b, a % b);
}

// Driver code
public static void main(String[] args) {
    int a = 20, b = 28;
    System.out.println(gcd(a, b)); 
}

}

Python

Recursive function to calculate GCD using Euclidean algorithm

def gcd(a, b): return a if b == 0 else gcd(b, a % b)

Driver code

a = 20 b = 28 print(gcd(a, b)) # Output: 4

C#

using System;

class GfG { // Recursive function to calculate GCD using Euclidean algorithm static int gcd(int a, int b) => b == 0 ? a : gcd(b, a % b);

// Driver code
static void Main()
{
    int a = 20, b = 28;
    Console.WriteLine(gcd(a, b)); 
}

}

JavaScript

// Recursive function to calculate GCD using Euclidean algorithm function gcd(a, b) { return b === 0 ? a : gcd(b, a % b); }

// Driver code let a = 20, b = 28; console.log(gcd(a, b));

`

**Time Complexity: O(log(min(a,b)))

**Auxiliary Space: O(log(min(a,b))

[Approach - 5] Using Built-in Function - O(log(min(a, b))) Time and O(1) Space

Languages like C++ have inbuilt functions to calculate GCD of two numbers.

Below is the implementation using inbuilt functions.

C++ `

#include #include using namespace std;

int gcd(int a, int b) { return __gcd(a, b); }

// Driver code int main() { int a = 20, b = 28; cout << gcd(a, b); return 0; }

Java

import java.math.BigInteger;

class GfG {

public static void main(String[] args) {
    int a = 20, b = 28;

    // Convert to BigInteger and compute GCD
    int gcd = BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).intValue();

    System.out.println(gcd); 
}

}

Python

import math

def gcd(a, b): return math.gcd(a, b)

Driver code

if name == 'main': a = 20 b = 28 print(gcd(a, b))

C#

using System;

class GfG { static int GCD(int a, int b) { return b == 0 ? a : GCD(b, a % b); }

// Driver code
static void Main()
{
    int a = 20, b = 28;
    Console.WriteLine(GCD(a, b)); 
}

}

JavaScript

function gcd(a, b) { return b === 0 ? a : gcd(b, a % b); }

// Driver code let a = 20, b = 28; console.log(gcd(a, b));

`

Please refer GCD of more than two (or array) numbers to find HCF of more than two numbers.