GCD of two numbers when one of them can be very large

23 Jun, 2022
Given two numbers ‘a’ and ‘b’ such that (0 <= a <= 10^12 and b <= b < 10^250). Find the GCD of two given numbers.Examples :  
Input: a = 978 
       b = 89798763754892653453379597352537489494736
Output: 6

Input: a = 1221 
       b = 1234567891011121314151617181920212223242526272829
Output: 3
 
Solution : In the given problem, we can see that first number ‘a’ can be handled by long long int data type but second number ‘b’ can not be handled by any int data type. Here we read second number as a string and we will try to make it less than and equal to ‘a’ by taking it’s modulo with ‘a’.Below is implementation of the above idea.  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find GCD of two numbers such that// the second number can be very large.#include<bits/stdc++.h>using namespace std;typedef long long int ll; // function to find gcd of two integer numbersll gcd(ll a, ll b){    if (!a)        return b;    return gcd(b % a, a);} // Here 'a' is integer and 'b' is string.// The idea is to make the second number (represented// as b) less than and equal to first number by// calculating its mod with first integer number// using basic mathematicsll reduceB(ll a, char b[]){    // Initialize result    ll mod = 0;     // calculating mod of b with a to make    // b like 0 <= b < a    for (int i = 0; i < strlen(b); i++)        mod = (mod * 10 + b[i] - '0') % a;     return mod; // return modulo} // This function returns GCD of 'a' and 'b'// where b can be very large and is represented// as a character array or stringll gcdLarge(ll a, char b[]){    // Reduce 'b' (second number) after modulo with a    ll num = reduceB(a, b);     // gcd of two numbers    return gcd(a, num);} // Driver programint main(){    // first number which is integer    ll a = 1221;     // second number is represented as string because    // it can not be handled by integer data type    char b[] = "1234567891011121314151617181920212223242526272829";    if (a == 0)        cout << b << endl;    else        cout << gcdLarge(a, b) << endl;     return 0;}
// Java program to find// GCD of two numbers// such that the second// number can be very large. class GFG{     // This function computes    // the gcd of 2 numbers    private static int gcd(int reduceNum, int b)    {        return b == 0 ?            reduceNum : gcd(b, reduceNum % b);    }     // Here 'a' is integer and 'b'    // is string. The idea is to make    // the second number (represented    // as b) less than and equal to    // first number by calculating its    // modulus with first integer    // number using basic mathematics    private static int reduceB(int a, String b)    {        int result = 0;        for (int i = 0; i < b.length(); i++)        {            result = (result * 10 +                      b.charAt(i) - '0') % a;        }        return result;    }     private static int gcdLarge(int a, String b)    {        // Reduce 'b' i.e the second        // number after modulo with a        int num = reduceB(a, b);                 // Now,use the euclid's algorithm        // to find the gcd of the 2 numbers        return gcd(num, a);    }     // Driver code    public static void main(String[] args)    {        // First Number which        // is the integer        int a = 1221;                 // Second Number is represented        // as a string because it cannot        // be represented as an integer        // data type        String b = "19837658191095787329";        if (a == 0)            System.out.println(b);        else            System.out.println(gcdLarge(a, b));    } // This code is contributed// by Tanishq Saluja.}
# Python3 program to find GCD of# two numbers such that the second# number can be very large.  # Function to find gcd# of two integer numbersdef gcd(a, b) :         if (a == 0) :        return b             return gcd(b % a, a) # Here 'a' is integer and 'b' is string.# The idea is to make the second number# (represented as b) less than and equal# to first number by calculating its mod# with first integer number using basic# mathematicsdef reduceB(a, b) :         # Initialize result    mod = 0     # Calculating mod of b with a    # to make b like 0 <= b < a    for i in range(0, len(b)) :                 mod = (mod * 10 + ord(b[i])) % a     return mod      # return modulo  # This function returns GCD of# 'a' and 'b' where b can be# very large and is represented# as a character array or stringdef gcdLarge(a, b) :         # Reduce 'b' (second number)    # after modulo with a    num = reduceB(a, b)     # gcd of two numbers    return gcd(a, num)  # Driver program # First number which is integera = 1221 # Second number is represented# as string because it can not# be handled by integer data typeb = "1234567891011121314151617181920212223242526272829"if a == 0:    print(b)else:    print(gcdLarge(a, b))  # This code is contributed by Nikita Tiwari.
// C# program to find GCD of// two numbers such that the// second number can be very large.using System; class GFG{// function to find gcd// of two integer numberspublic long gcd(long a, long b){    if (a == 0)    return b;    return gcd(b % a, a);} // Here 'a' is integer and// 'b' is string. The idea// is to make the second// number (represented as b)// less than and equal to// first number by calculating// its mod with first integer// number using basic mathematicspublic long reduceB(long a, string b){    // Initialize result    long mod = 0;     // calculating mod of    // b with a to make    // b like 0 <= b < a    for (int i = 0; i < b.Length; i++)        mod = (mod * 10 +              (b[i] - '0')) % a;     return mod;} // This function returns GCD// of 'a' and 'b' where b can// be very large and is// represented as a character// array or stringpublic long gcdLarge(long a, string b){    // Reduce 'b' (second number)    // after modulo with a    long num = reduceB(a, b);     // gcd of two numbers    return gcd(a, num);} // Driver Codestatic void Main(){    // first number    // which is integer    long a = 1221;     // second number is represented    // as string because it can not    // be handled by integer data type    string b = "1234567891011121314151617181920212223242526272829";    GFG p = new GFG();    if (a == 0)        Console.WriteLine(b);    else        Console.WriteLine(p.gcdLarge(a, b)); }} // This code is contributed by mits.
<?php// PHP program to find GCD of// two numbers such that the// second number can be very large. // function to find gcd of// two integer numbersfunction gcd($a, $b){    if (!$a)    return $b;    return gcd($b % $a, $a);} // Here 'a' is integer and 'b'// is string. The idea is to// make the second number// (represented as b) less than// and equal to first number by// calculating its mod with first// integer number using basic mathematicsfunction reduceB($a, $b){    // Initialize result    $mod = 0;     // calculating mod of b with    // a to make b like 0 <= b < a    for ($i = 0; $i < strlen($b); $i++)        $mod = ($mod * 10 +                $b[$i] - '0') % $a;     // return modulo    return $mod;} // This function returns GCD of// 'a' and 'b' where b can be// very large and is represented// as a character array or stringfunction gcdLarge($a, $b){    // Reduce 'b' (second number)    // after modulo with a    $num = reduceB($a, $b);     // gcd of two numbers    return gcd($a, $num);} // Driver Code // first number which is integer$a = 1221; // second number is represented// as string because it can not// be handled by integer data type$b = "1234567891011121314151617181920212223242526272829"; if ($a == 0) {    echo($b);}else {    echo gcdLarge($a, $b);} // This code is contributed by nitin mittal.?>
<script> // JavaScript program to find GCD of two numbers such that// the second number can be very large. // function to find gcd of two integer numbersfunction gcd( a, b){    if (!a)       return b;    return gcd(b%a,a);} // Here 'a' is integer and 'b' is string.// The idea is to make the second number (represented// as b) less than and equal to first number by// calculating its mod with first integer number// using basic mathematicsfunction reduceB( a,  b){    // Initialize result    let mod = 0;     // calculating mod of b with a to make    // b like 0 <= b < a    for (let i=0; i<b.length-1; i++)        mod = (mod*10 + b[i] - '0')%a;     return mod; // return modulo} // This function returns GCD of 'a' and 'b'// where b can be very large and is represented// as a character array or stringfunction gcdLarge( a, b){    // Reduce 'b' (second number) after modulo with a    let num = reduceB(a, b);     // gcd of two numbers    return gcd(a, num);} // Driver program  // first number which is integer    let a = 1221;     // second number is represented as string because    // it can not be handled by integer data type    let b = "1234567891011121314151617181920212223242526272829";    if (a == 0)        document.write( b);    else        document.write(gcdLarge(a, b)); // This code contributed by aashish1995 </script>
3
Time Complexity: O(log (min(a,b))) Auxiliary Space: O(log (min(a,b))) 
This article is contributed by Aarti_Rathi and Shashank Mishra (Gullu).This article is reviewed by team GeeksforGeeks . Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
Mithun Kumar
TanishqSaluja
urcoder4u
aashish1995
rushal06
codewithrathi
large-numbers
Modular Arithmetic
Mathematical
Mathematical
Modular Arithmetic
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Operators in C / C++
Sieve of Eratosthenes
Prime Numbers
Find minimum number of coins that make a given value
Minimum number of jumps to reach end
The Knight's tour problem | Backtracking-1
Algorithm to solve Rubik's Cube
Program for Decimal to Binary Conversion
Modulo 10^9+7 (1000000007)