Open In App
Related Articles

Subtraction of two large numbers using 9’s complement

Improve Article
Improve
Save Article
Save
Like Article
Like

Given two strings str1 and str2 of given lengths N and M respectively, each representing a large number, the task is to subtract one from the other using 9’s complement.
Examples:

Input: N = 17, str1 = “12345678987654321”, M = 11, str2 = “22324324343” 
Output: 12345656663329978
Input: N = 20, Str1 = “12345334233242431433”, M = 20, Str2 = “12345334233242431432” 
Output: 1

Approach: 
The basic idea is similar to Subtraction of two numbers using 2’s complement

Subtraction of given strings can be written as 
Str1 – Str2 = Str1 + (- Str2) = Str1 + (9’s complement of Str2) 

Follow the steps below to solve the problem: 
 

  • Compare the lengths of the two strings and store the smaller of the two in str2.
  • Calculate 9’s complement of str2.
  • Now, add 9’s complement of str2 to str1.
  • If any carry is generated, insert at the beginning of str1.
  • If no carry is generated, then the complement of str1 is the final answer.

Below is the implementation of the above approach:

C++




// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return sum of two
// large numbers given as strings
string sumBig(string a, string b)
{
 
    // Compare their lengths
    if (a.length() > b.length())
        swap(a, b);
 
    // Stores the result
    string str = "";
 
    // Store the respective lengths
    int n1 = a.length(),
        n2 = b.length();
 
    int diff = n2 - n1;
 
    // Initialize carry
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n1 - 1; i >= 0; i--) {
        // Compute sum of
        // current digits and carry
        int sum = ((a[i] - '0')
                   + (b[i + diff] - '0')
                   + carry);
 
        // Store the result
        str.push_back(sum % 10 + '0');
 
        // Update carry
        carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--) {
 
        int sum = ((b[i] - '0') + carry);
 
        str.push_back(sum % 10 + '0');
        carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry)
        str.push_back(carry + '0');
 
    // Reverse resultant string
    reverse(str.begin(), str.end());
 
    return str;
}
 
// Function return 9's
// complement of given number
string complement9(string v)
{
    // Stores the complement
    string complement = "";
 
    for (int i = 0; i < v.size(); i++) {
 
        // Subtract every bit from 9
        complement += '9' - v[i] + '0';
    }
 
    // Return the result
    return complement;
}
 
// Function returns subtraction
// of two given numbers as strings
string subtract(string a, string b)
{
 
    // If second string is larger
    if (a.length() < b.length())
        swap(a, b);
 
    // Calculate respective lengths
    int l1 = a.length(),
        l2 = b.length();
 
    // If lengths are equal
    int diffLen = l1 - l2;
 
    for (int i = 0; i < diffLen; i++) {
 
        // Insert 0's to the beginning
        // of b to make both the lengths equal
        b = "0" + b;
    }
 
    // Add (complement of B) and A
    string c = sumBig(a, complement9(b));
 
    // If length of new string is greater
    // than length of first string,
    // than carry is generated
    if (c.length() > a.length()) {
        string::iterator it;
 
        // bit1 is the carry bit
        char bit1 = c[0];
        string bit = { bit1 };
        it = c.begin();
        c.erase(it);
        c = sumBig(c, bit);
        return c;
    }
 
    // If both lengths are equal
    else {
        return complement9(c);
    }
}
 
// Driver Code
int main()
{
 
    string str1 = "12345678987654321";
    string str2 = "22324324343";
 
    cout << subtract(str1, str2) << endl;
 
    return 0;
}


Java




import java.io.*;
import java.lang.*;
import java.util.*;
public class Main
{
 
  // Function to return sum of two
  // large numbers given as strings
  static String sumBig(String a, String b)
  {
 
    // Compare their lengths
    if (a.length() > b.length()) {
      String c = a;
      a = b;
      b = c;
    }
 
    // Stores the result
    String str = "";
 
    // Store the respective lengths
    int n1 = a.length(), n2 = b.length();
 
    int diff = n2 - n1;
 
    // Initialize carry
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n1 - 1; i >= 0; i--) {
      // Compute sum of
      // current digits and carry
      int sum
        = ((a.charAt(i) - '0')
           + (b.charAt(i + diff) - '0') + carry);
 
      // Store the result
      str += (char)(sum % 10 + '0');
 
      // Update carry
      carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--) {
 
      int sum = ((b.charAt(i) - '0') + carry);
      str += (char)(sum % 10 + '0');
      carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry != 0)
      str += (char)(carry + '0');
 
    // Reverse resultant string
    String rev = "";
 
    for (int i = str.length() - 1; i >= 0; i--)
      rev = rev + str.charAt(i);
 
    return rev;
  }
  // Function return 9's
  // complement of given number
  static String complement9(String v)
  {
    // Stores the complement
    String complement = "";
 
    for (int i = 0; i < v.length(); i++) {
 
      // Subtract every bit from 9
      int x = '9' - v.charAt(i) + '0';
      complement += (char)x;
    }
    // Return the result
    return complement;
  }
 
  // Function returns subtraction
  // of two given numbers as strings
  static String subtract(String a, String b)
  {
 
    // If second string is larger
    if (a.length() < b.length()) {
      String c = a;
      a = b;
      b = c;
    }
 
    // Calculate respective lengths
    int l1 = a.length(), l2 = b.length();
 
    // If lengths are equal
    int diffLen = l1 - l2;
 
    for (int i = 0; i < diffLen; i++) {
 
      // Insert 0's to the beginning
      // of b to make both the lengths equal
      b = "0" + b;
    }
 
    // Add (complement of B) and A
    String c = sumBig(a, complement9(b));
 
    // If length of new string is greater
    // than length of first string,
    // than carry is generated
    if (c.length() > a.length()) {
 
      // bit1 is the carry bit
      char bit1 = c.charAt(0);
      String bit = "";
      bit += bit1;
      StringBuilder sb = new StringBuilder(c);
      sb.deleteCharAt(0);
      c = sb.toString();
      c = sumBig(c, bit);
      return c;
    }
 
    // If both lengths are equal
    else {
      return complement9(c);
    }
  }
  public static void main(String[] args)
  {
    String str1 = "12345678987654321";
    String str2 = "22324324343";
 
    System.out.println(subtract(str1, str2));
  }
}
 
// This code is contributed by garg28harsh.


Python3




# Python3 Program to implement
# the above approach
 
# Function to return sum of two
# large numbers given as strings
def sumBig(a, b):
 
    # Compare their lengths
    if (len(a) > len(b)):
     
        temp = a;
        a = b;
        b = temp;
     
     
    # Stores the result
    str1 = "";
 
    # Store the respective lengths
    n1 = len(a)
    n2 = len(b);
 
    diff = n2 - n1;
 
    # Initialize carry
    carry = 0;
 
    # Traverse from end of both strings
    for i in range(n1 - 1, -1, -1):
        # Compute sum of
        # current digits and carry
        sums = ( int(a[i]) + int(b[i + diff]) + carry);
 
        # Store the result
        str1 += str((sums % 10));
 
        # Update carry
        carry = int(sums / 10);
     
 
    # Add remaining digits of str2[]
    for i in range(n2 - n1 - 1, -1, -1):
 
        sums = (int(b[i]) + carry);
 
        str1 += str((sums % 10));
        carry = int(sums/ 10);
     
    # Add remaining carry
    if (carry > 0):
        str1 += str(carry)
 
    # Reverse resultant string
    str1 = str1[::-1]
 
    return str1;
 
# Function return 9's
# complement of given number
def complement9( v):
 
    # Stores the complement
    complement = "";
     
    for i in range(len(v)):
 
        # Subtract every bit from 9
        complement += str(9 - int(v[i]));
     
    # Return the result
    return complement;
 
# Function returns subtraction
# of two given numbers as strings
def subtract(a, b):
 
    # If second string is larger
    if (len(a) < len(b)):
     
        temp = a;
        a = b;
        b = temp;
     
    # Calculate respective lengths
    l1 = len(a)
    l2 = len(b);
 
    # If lengths are equal
    diffLen = l1 - l2;
     
    for i in range(diffLen):
 
        # Insert 0's to the beginning
        # of b to make both the lengths equal
        b = "0" + b;
     
    # Add (complement of B) and A
    c = sumBig(a, complement9(b));
 
    # If length of new string is greater
    # than length of first string,
    # than carry is generated
    if (len(c) > len(a)):
 
        # bit1 is the carry bit
        bit1 = c[0];
        bit = [ bit1 ];
        c = c[1::];
        c = sumBig(c, bit);
        return c;
     
    # If both lengths are equal
    else :
        return complement9(c);
     
# Driver Code
str1 = "12345678987654321";
str2 = "22324324343";
 
print(subtract(str1, str2));
 
# This code is contributed by phasing17.


C#




// C# Program to implement
// the above approach
using System;
using System.Linq;
using System.Collections.Generic;
 
class GFG
{
  // Function to return sum of two
  // large numbers given as strings
  static string sumBig(string a, string b)
  {
 
    // Compare their lengths
    if (a.Length > b.Length)
    {var temp = b; b = a; a = temp; };
 
    // Stores the result
    string str = "";
 
    // Store the respective lengths
    int n1 = a.Length,
    n2 = b.Length;
 
    int diff = n2 - n1;
 
    // Initialize carry
    int carry = 0;
 
    // Traverse from end of both strings
    for (int i = n1 - 1; i >= 0; i--) {
      // Compute sum of
      // current digits and carry
      int sum = ((a[i] - '0')
                 + (b[i + diff] - '0')
                 + carry);
 
      // Store the result
      str += (char)(sum % 10 + '0');
 
      // Update carry
      carry = sum / 10;
    }
 
    // Add remaining digits of str2[]
    for (int i = n2 - n1 - 1; i >= 0; i--) {
 
      int sum = ((b[i] - '0') + carry);
 
      str+= (char)(sum % 10 + '0');
      carry = sum / 10;
    }
 
    // Add remaining carry
    if (carry != 0)
      str += (char)(carry + '0');
 
    // Reverse resultant string
    char[] strc = str.ToCharArray();
    Array.Reverse(strc);
    return new string(strc);
  }
 
  // Function return 9's
  // complement of given number
  static string complement9(string v)
  {
    // Stores the complement
    string complement = "";
 
    for (int i = 0; i < v.Length; i++) {
 
      // Subtract every bit from 9
      complement += (char)('9' - v[i] + '0');
    }
 
    // Return the result
    return complement;
  }
 
  // Function returns subtraction
  // of two given numbers as strings
  static string subtract(string a, string b)
  {
 
    // If second string is larger
    if (a.Length < b.Length)
    {var temp = b; b = a; a = temp; };
 
    // Calculate respective lengths
    int l1 = a.Length,
    l2 = b.Length;
 
    // If lengths are equal
    int diffLen = l1 - l2;
 
    for (int i = 0; i < diffLen; i++) {
 
      // Insert 0's to the beginning
      // of b to make both the lengths equal
      b = "0" + b;
    }
 
    // Add (complement of B) and A
    string c = sumBig(a, complement9(b));
 
    // If length of new string is greater
    // than length of first string,
    // than carry is generated
    if (c.Length > a.Length) {
      List<char> c1 = c.ToList();
 
 
      // bit1 is the carry bit
      char bit1 = c[0];
      string bit = "" + bit1;
 
      c1.RemoveAt(0);
      c = new string(c1.ToArray());
 
      c = sumBig(c, bit);
      return c;
    }
 
    // If both lengths are equal
    else {
      return complement9(c);
    }
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
 
    string str1 = "12345678987654321";
    string str2 = "22324324343";
 
    Console.WriteLine(subtract(str1, str2));
  }
}
 
// This code is contributed by phasing17.


Javascript




// JS Program to implement
// the above approach
 
// Function to return sum of two
// large numbers given as strings
function sumBig(a, b)
{
 
    // Compare their lengths
    if (a.length > b.length)
    {
        let temp = a;
        a = b;
        b = temp;
    }
     
    // Stores the result
    let str = "";
 
    // Store the respective lengths
    let n1 = a.length,
        n2 = b.length;
 
    let diff = n2 - n1;
 
    // Initialize carry
    let carry = 0;
 
    // Traverse from end of both strings
    for (let i = n1 - 1; i >= 0; i--) {
        // Compute sum of
        // current digits and carry
        let sum = ( parseInt(a[i])
                   + parseInt(b[i + diff])
                   + carry);
 
        // Store the result
        str += ((sum % 10).toString());
 
        // Update carry
        carry = Math.floor(sum / 10);
    }
 
    // Add remaining digits of str2[]
    for (var i = n2 - n1 - 1; i >= 0; i--) {
 
        var sum = (parseInt(b[i]) + carry);
 
        str += ((sum % 10).toString());
        carry = Math.floor(sum / 10);
    }
 
    // Add remaining carry
    if (carry > 0)
        str += (carry.toString());
 
    // Reverse resultant string
    str = str.split("").reverse().join("")
 
    return str;
}
 
// Function return 9's
// complement of given number
function complement9( v)
{
    // Stores the complement
    let complement = "";
 
    for (var i = 0; i < v.length; i++) {
 
        // Subtract every bit from 9
        complement += (9 - parseInt(v[i])).toString();
    }
 
    // Return the result
    return complement;
}
 
// Function returns subtraction
// of two given numbers as strings
function subtract(a, b)
{
 
    // If second string is larger
    if (a.length < b.length)
    {
        let temp = a;
        a = b;
        b = temp;
    }
 
    // Calculate respective lengths
    let l1 = a.length,
        l2 = b.length;
 
    // If lengths are equal
    let diffLen = l1 - l2;
 
    for (let i = 0; i < diffLen; i++) {
 
        // Insert 0's to the beginning
        // of b to make both the lengths equal
        b = "0" + b;
    }
 
    // Add (complement of B) and A
    let c = sumBig(a, complement9(b));
 
    // If length of new string is greater
    // than length of first string,
    // than carry is generated
    if (c.length > a.length) {
 
        // bit1 is the carry bit
        let bit1 = c[0];
        let bit = [ bit1 ];
        c = c.substr(1);
        c = sumBig(c, bit);
        return c;
    }
 
    // If both lengths are equal
    else {
        return complement9(c);
    }
}
 
// Driver Code
let str1 = "12345678987654321";
let str2 = "22324324343";
 
console.log(subtract(str1, str2));
 
// This code is contributed by phasing17.


Output: 

12345656663329978

 

Time Complexity: O(max(N, M)) 
Auxiliary Space: O(max(N, M))
 


Last Updated : 15 Nov, 2022
Like Article
Save Article
Similar Reads
Related Tutorials