Difference of two large numbers

Given two numbers as strings. The numbers may be very large (may not fit in long long int), the task is to find difference of these two numbers.

Examples:

Input : str1 = "11443333311111111100", 
        str2 =     "1144422222221111"
Output : 11442188888888889989

Input :str1 = "122387876566565674",
       str2 =     "31435454654554"
Output : 122356441111911120

This is simple based on school mathematics. We traverse both strings from end, one by one subtract digits.
1) Reverse both strings.
2) Keep subtracting digits one by one from 0’th index (in reversed strings) to end of smaller string, append the diff if it’s positive to end of result. If difference(diff) is negative then add 10 and keep track of carry as 1 if it’s positive then carry is 0.
3) Finally reverse the result.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find difference of two large numbers.
#include<bits/stdc++.h>
using namespace std;
  
// Returns true if str1 is smaller than str2.
bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
  
    if (n1 < n2)
    return true;
    if (n2 < n1)
    return false;
  
    for (int i=0; i<n1; i++)
    if (str1[i] < str2[i])
        return true;
    else if (str1[i] > str2[i])
        return false;
  
    return false;
}
  
// Function for find difference of larger numbers
string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
        swap(str1, str2);
  
    // Take an empty string for storing result
    string str = "";
  
    // Calculate length of both string
    int n1 = str1.length(), n2 = str2.length();
  
    // Reverse both of strings
    reverse(str1.begin(), str1.end());
    reverse(str2.begin(), str2.end());
      
    int carry = 0;
  
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for (int i=0; i<n2; i++)
    {
        // Do school mathematics, compute difference of
        // current digits
          
        int sub = ((str1[i]-'0')-(str2[i]-'0')-carry);
          
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
  
        str.push_back(sub + '0');
    }
  
    // subtract remaining digits of larger number
    for (int i=n2; i<n1; i++)
    {
        int sub = ((str1[i]-'0') - carry);
          
        // if the sub value is -ve, then make it positive
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
              
        str.push_back(sub + '0');
    }
  
    // reverse resultant string
    reverse(str.begin(), str.end());
  
    return str;
}
  
// Driver code
int main()
{
    string str1 = "978";
    string str2 = "12977";
    cout << findDiff(str1, str2) << endl;
      
    string s1 = "100";
    string s2 = "1000000";
    cout << findDiff(s1,s2);
      
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find difference of two large numbers.
import java.util.*;
  
class GFG
{
  
// Returns true if str1 is smaller than str2.
static boolean isSmaller(String str1, String str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
      
    for (int i = 0; i < n1; i++)
    if (str1.charAt(i) < str2.charAt(i))
        return true;
    else if (str1.charAt(i) > str2.charAt(i))
        return false;
  
    return false;
}
  
// Function for find difference of larger numbers
static String findDiff(String str1, String str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
    {
        String t = str1;
        str1 = str2;
        str2 = t;
    }
  
    // Take an empty string for storing result
    String str = "";
  
    // Calculate length of both string
    int n1 = str1.length(), n2 = str2.length();
  
    // Reverse both of strings
    str1 = new StringBuilder(str1).reverse().toString();
    str2 = new StringBuilder(str2).reverse().toString();
      
    int carry = 0;
  
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for (int i = 0; i < n2; i++)
    {
        // Do school mathematics, compute difference of
        // current digits
        int sub = ((int)(str1.charAt(i)-'0') - 
                   (int)(str2.charAt(i)-'0')-carry);
          
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
  
        str += (char)(sub + '0');
    }
  
    // subtract remaining digits of larger number
    for (int i = n2; i < n1; i++)
    {
        int sub = ((int)(str1.charAt(i) - '0') - carry);
          
        // if the sub value is -ve, then make it positive
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
              
        str += (char)(sub + '0');
    }
  
    // reverse resultant string
    return new StringBuilder(str).reverse().toString();
}
  
// Driver code
public static void main(String[] args)
{
    String str1 = "978";
    String str2 = "12977";
    System.out.println(findDiff(str1, str2));
  
    String s1 = "100";
    String s2 = "1000000";
    System.out.println(findDiff(s1,s2));
}
}
  
// This code is contributed by mits

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python 3 program to find difference of two large numbers.
   
# Returns true if str1 is smaller than str2.
def isSmaller(str1, str2):
  
    # Calculate lengths of both string
    n1 = len(str1) 
    n2 = len(str2)
   
    if (n1 < n2):
        return True
    if (n2 < n1):
        return False
   
    for i in range(n1):
        if (str1[i] < str2[i]):
            return True
        elif (str1[i] > str2[i]):
            return False
   
    return False
   
# Function for find difference of larger numbers
def findDiff(str1, str2):
  
    # Before proceeding further, make sure str1
    # is not smaller
    if (isSmaller(str1, str2)):
        temp = str1
        str1 = str2
        str2 = temp
   
    #Take an empty string for storing result
    str3 = ""
   
    # Calculate length of both string
    n1 = len(str1) 
    n2 = len(str2)
   
    # Reverse both of strings
    str1= str1[::-1]
    str2 = str2[::-1]
  
    carry = 0
   
    # Run loop till small string length
    # and subtract digit of str1 to str2
    for i in range(n2):
      
        # Do school mathematics, compute difference of
        # current digits
           
        sub = ((ord(str1[i])-ord('0'))-(ord(str2[i])-ord('0'))-carry)
          
        # If subtraction is less then zero
        # we add then we add 10 into sub and
        # take carry as 1 for calculating next step
        if (sub < 0):
          
            sub = sub + 10
            carry = 1
              
        else:
            carry = 0
  
        str3 = str3+str(sub )
          
    # subtract remaining digits of larger number
    for i in range(n2,n1):
      
        sub = ((ord(str1[i])-ord('0')) - carry)
           
        # if the sub value is -ve, then make it positive
        if (sub < 0):
          
            sub = sub + 10
            carry = 1
          
        else:
            carry = 0
               
        str3 = str3+str(sub )
   
    # reverse resultant string
    str3= str3[::-1]
   
    return str3
  
# Driver code
if __name__ == "__main__":
    str1 = "978"
    str2 = "12977"
    print(findDiff(str1, str2))
       
    s1 = "100"
    s2 = "1000000"
    print(findDiff(s1,s2))
  
#This code is contributed by ChitraNayal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find difference of two large numbers.
using System;
using System.Collections;
  
class GFG
{
  
// Returns true if str1 is smaller than str2.
static bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.Length, n2 = str2.Length;
    if (n1 < n2)
        return true;
    if (n2 < n1)
        return false;
      
    for (int i = 0; i < n1; i++)
    if (str1[i] < str2[i])
        return true;
    else if (str1[i] > str2[i])
        return false;
  
    return false;
}
  
// Function for find difference of larger numbers
static string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
    {
        string t = str1;
        str1 = str2;
        str2 = t;
    }
  
    // Take an empty string for storing result
    string str = "";
  
    // Calculate length of both string
    int n1 = str1.Length, n2 = str2.Length;
  
    // Reverse both of strings
    char[] ch1 = str1.ToCharArray();
    Array.Reverse( ch1 );
    str1 = new string( ch1 );
    char[] ch2 = str2.ToCharArray();
    Array.Reverse( ch2 );
    str2 = new string( ch2 );
      
    int carry = 0;
  
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for (int i = 0; i < n2; i++)
    {
        // Do school mathematics, compute difference of
        // current digits
        int sub = ((int)(str1[i] - '0') - 
                (int)(str2[i] - '0') - carry);
          
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
  
        str += (char)(sub + '0');
    }
  
    // subtract remaining digits of larger number
    for (int i = n2; i < n1; i++)
    {
        int sub = ((int)(str1[i] - '0') - carry);
          
        // if the sub value is -ve, then make it positive
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
              
        str += (char)(sub + '0');
    }
  
    // reverse resultant string
    char[] ch3 = str.ToCharArray();
    Array.Reverse( ch3 );
    return new string( ch3 );
}
  
// Driver code
public static void Main()
{
    string str1 = "978";
    string str2 = "12977";
    Console.WriteLine(findDiff(str1, str2));
  
    string s1 = "100";
    string s2 = "1000000";
    Console.WriteLine(findDiff(s1,s2));
}
}
  
// This code is contributed by mits

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find difference of two large numbers.
  
// Returns true if str1 is smaller than str2.
function isSmaller($str1, $str2)
{
    // Calculate lengths of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
  
    if ($n1 < $n2)
    return true;
    if ($n2 < $n1)
    return false;
  
    for ($i=0; $i<$n1; $i++)
    if ($str1[$i] < $str2[$i])
        return true;
    else if ($str1[$i] > $str2[$i])
        return false;
  
    return false;
}
  
// Function for find difference of larger numbers
function findDiff($str1, $str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller($str1, $str2)){
        $t=$str1;
        $str1=$str2;
        $str2=$t;
    }
  
    // Take an empty string for storing result
    $str = "";
  
    // Calculate length of both string
    $n1 = strlen($str1);
    $n2 = strlen($str2);
  
    // Reverse both of strings
    $str1=strrev($str1);
    $str2=strrev($str2);
      
    $carry = 0;
  
    // Run loop till small string length
    // and subtract digit of str1 to str2
    for ($i=0; $i<$n2; $i++)
    {
        // Do school mathematics, compute difference of
        // current digits
          
        $sub=((ord($str1[$i])-ord('0'))-(ord($str2[$i])-ord('0'))-$carry);
          
        // If subtraction is less then zero
        // we add then we add 10 into sub and
        // take carry as 1 for calculating next step
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
  
        $str.=chr($sub+48);
    }
  
    // subtract remaining digits of larger number
    for ($i=$n2; $i<$n1; $i++)
    {
        $sub = ((ord($str1[$i])-ord('0')) - $carry);
          
        // if the sub value is -ve, then make it positive
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
              
        $str.=chr($sub+48);
    }
  
    // reverse resultant string
    $str=strrev($str);
  
    return $str;
}
  
// Driver code
  
    $str1 = "978";
    $str2 = "12977";
    echo findDiff($str1, $str2)."\n";
      
    $s1 = "100";
    $s2 = "1000000";
    echo findDiff($s1,$s2);
      
// This code is contributed by mits
?>

chevron_right



Output:

11999
0999900

 

Optimized solution :
We can avoid the first two string reverse operations by traversing them from end. Below is optimized solution.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to find difference of two large numbers.
#include<bits/stdc++.h>
using namespace std;
  
// Returns true if str1 is smaller than str2,
// else false.
bool isSmaller(string str1, string str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
  
    if (n1 < n2)
        return true;
    if (n2 > n1)
        return false;
  
    for (int i=0; i<n1; i++)
    {
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
    }
    return false;
}
  
// Function for finding difference of larger numbers
string findDiff(string str1, string str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
        swap(str1, str2);
  
    // Take an empty string for storing result
    string str = "";
  
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
    int diff = n1 - n2;
  
    // Initially take carry zero
    int carry = 0;
  
    // Traverse from end of both strings
    for (int i=n2-1; i>=0; i--)
    {
        // Do school mathematics, compute difference of
        // current digits and carry
        int sub = ((str1[i+diff]-'0') -
                   (str2[i]-'0') -
                   carry);
        if (sub < 0)
        {
            sub = sub+10;
            carry = 1;
        }
        else
            carry = 0;
  
        str.push_back(sub + '0');
    }
  
    // subtract remaining digits of str1[]
    for (int i=n1-n2-1; i>=0; i--)
    {
        if (str1[i]=='0' && carry)
        {
            str.push_back('9');
            continue;
        }
        int sub = ((str1[i]-'0') - carry);
        if (i>0 || sub>0) // remove preceding 0's
            str.push_back(sub+'0');
        carry = 0;
  
    }
  
    // reverse resultant string
    reverse(str.begin(), str.end());
  
    return str;
}
  
// Driver code
int main()
{
    string str1 = "88";
    string str2 = "1079";
    cout << findDiff(str1, str2);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find difference of two large numbers.
  
class GFG
{
      
// Returns true if str1 is smaller than str2,
// else false.
static boolean isSmaller(String str1, String str2)
{
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
  
    if (n1 < n2)
        return true;
    if (n2 > n1)
        return false;
  
    for (int i = 0; i < n1; i++)
    {
        if (str1.charAt(i) < str2.charAt(i))
            return true;
        else if (str1.charAt(i) > str2.charAt(i))
            return false;
    }
    return false;
}
  
// Function for finding difference of larger numbers
static String findDiff(String str1, String str2)
{
    // Before proceeding further, make sure str1
    // is not smaller
    if (isSmaller(str1, str2))
    {
        String t = str1; 
        str1 = str2;
        str2 = t;
    }
  
    // Take an empty string for storing result
    String str = "";
  
    // Calculate lengths of both string
    int n1 = str1.length(), n2 = str2.length();
    int diff = n1 - n2;
  
    // Initially take carry zero
    int carry = 0;
  
    // Traverse from end of both strings
    for (int i = n2 - 1; i >= 0; i--)
    {
        // Do school mathematics, compute difference of
        // current digits and carry
        int sub = (((int)str1.charAt(i + diff) - (int)'0') -
                    ((int)str2.charAt(i) - (int)'0') - carry);
        if (sub < 0)
        {
            sub = sub+10;
            carry = 1;
        }
        else
            carry = 0;
  
        str += String.valueOf(sub);
    }
  
    // subtract remaining digits of str1[]
    for (int i = n1 - n2 - 1; i >= 0; i--)
    {
        if (str1.charAt(i) == '0' && carry > 0)
        {
            str += "9";
            continue;
        }
        int sub = (((int)str1.charAt(i) - (int)'0') - carry);
        if (i > 0 || sub > 0) // remove preceding 0's
            str += String.valueOf(sub);
        carry = 0;
  
    }
  
    // reverse resultant string 
    return new StringBuilder(str).reverse().toString();
}
  
// Driver code
public static void main (String[] args) 
{
    String str1 = "88";
    String str2 = "1079";
    System.out.println(findDiff(str1, str2));
}
}
  
// This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find difference of 
// two large numbers.
using System;
  
class GFG
{
      
// Returns true if str1 is smaller
// than str2, else false.
static bool isSmaller(string str1, 
                      string str2)
{
    // Calculate lengths of both string
    int n1 = str1.Length, 
        n2 = str2.Length;
  
    if (n1 < n2)
        return true;
    if (n2 > n1)
        return false;
  
    for (int i = 0; i < n1; i++)
    {
        if (str1[i] < str2[i])
            return true;
        else if (str1[i] > str2[i])
            return false;
    }
    return false;
}
  
// Function for finding difference of
// larger numbers
static string findDiff(string str1, 
                       string str2)
{
    // Before proceeding further,
    // make sure str1 is not smaller
    if (isSmaller(str1, str2))
    {
        string t = str1; 
        str1 = str2;
        str2 = t;
    }
  
    // Take an empty string for 
    // storing result
    String str = "";
  
    // Calculate lengths of both string
    int n1 = str1.Length, n2 = str2.Length;
    int diff = n1 - n2;
  
    // Initially take carry zero
    int carry = 0;
  
    // Traverse from end of both strings
    for (int i = n2 - 1; i >= 0; i--)
    {
        // Do school mathematics, compute 
        // difference of current digits and carry
        int sub = (((int)str1[i + diff] - (int)'0') -
                   ((int)str2[i] - (int)'0') - carry);
        if (sub < 0)
        {
            sub = sub + 10;
            carry = 1;
        }
        else
            carry = 0;
  
        str += sub.ToString();
    }
  
    // subtract remaining digits of str1[]
    for (int i = n1 - n2 - 1; i >= 0; i--)
    {
        if (str1[i] == '0' && carry > 0)
        {
            str += "9";
            continue;
        }
        int sub = (((int)str1[i] - (int)'0') - carry);
        if (i > 0 || sub > 0) // remove preceding 0's
            str += sub.ToString();
        carry = 0;
  
    }
  
    // reverse resultant string
    char[] aa = str.ToCharArray();
    Array.Reverse(aa);
    return new string(aa);
}
  
// Driver code
public static void Main () 
{
    String str1 = "88";
    String str2 = "1079";
    Console.WriteLine(findDiff(str1, str2));
}
}
  
// This code is contributed by mits

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find difference of two 
// large numbers.
  
// Returns true if str1 is smaller than 
// str2, else false.
function isSmaller($str1, $str2)
{
    // Calculate lengths of both string
    $n1 = strlen($str1); 
    $n2 = strlen($str2);
  
    if ($n1 < $n2)
        return true;
    if ($n2 > $n1)
        return false;
  
    for ($i = 0; $i < $n1; $i++)
    {
        if ($str1[$i] < $str2[$i])
            return true;
        else if ($str1[$i] > $str2[$i])
            return false;
    }
    return false;
}
  
// Function for finding difference 
// of larger numbers
function findDiff($str1, $str2)
{
    // Before proceeding further, make 
    // sure str1 is not smaller
    if (isSmaller($str1, $str2))
    {
        $t = $str1;
        $str1 = $str2;
        $str2 = $t;
    }
  
    // Take an empty string for storing result
    $str = "";
  
    // Calculate lengths of both string
    $n1 = strlen($str1); 
    $n2 = strlen($str2);
    $diff = $n1 - $n2;
  
    // Initially take carry zero
    $carry = 0;
  
    // Traverse from end of both strings
    for ($i = $n2 - 1; $i >= 0; $i--)
    {
        // Do school mathematics, compute 
        // difference of current digits and carry
        $sub = ((ord($str1[$i + $diff]) - ord('0')) - 
                (ord($str2[$i]) - ord('0')) - $carry);
        if ($sub < 0)
        {
            $sub = $sub + 10;
            $carry = 1;
        }
        else
            $carry = 0;
  
        $str.=chr($sub + ord("0"));
    }
  
    // subtract remaining digits of str1[]
    for ($i = $n1 - $n2 - 1; $i >= 0; $i--)
    {
        if ($str1[$i] == '0' && $carry > 0)
        {
            $str.="9";
            continue;
        }
        $sub = (ord($str1[$i]) - ord('0') - $carry);
        if ($i > 0 || $sub > 0) // remove preceding 0's
            $str.=chr($sub + ord("0"));
        $carry = 0;
  
    }
  
    // reverse resultant string
    return strrev($str);
  
}
  
// Driver code
$str1 = "88";
$str2 = "1079";
print(findDiff($str1, $str2));
  
// This code is contributed by chandan_jnu
?>

chevron_right



Output:

991

Time complexity : O(n1 + n2)

This article is contributed by DANISH_RAZA . 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.



My Personal Notes arrow_drop_up