Subtraction of two large numbers using 9’s compliment

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 compliment of str2.
  • Now, add 9’s compliment of str2 to str1.
  • If any carry is generated, insert at the beginning of str1.
  • If no carry is generated, then the compliment of str1 is the final answer.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to implement
// the above appraoch
#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 compliment9(string v)
{
    // Stores the compliment
    string compliment = "";
  
    for (int i = 0; i < v.size(); i++) {
  
        // Subtract every bit from 9
        compliment += '9' - v[i] + '0';
    }
  
    // Return the result
    return compliment;
}
  
// 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, compliment9(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 compliment9(c);
    }
}
  
// Driver Code
int main()
{
  
    string str1 = "12345678987654321";
    string str2 = "22324324343";
  
    cout << subtract(str1, str2) << endl;
  
    return 0;
}

chevron_right


Output:

12345656663329978

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

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

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.