Related Articles
Subtraction of two large numbers using 9’s compliment
• Last Updated : 19 Jul, 2020

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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++

 `// C++ Program to implement``// the above appraoch``#include ``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;``        ``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;``}`
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 mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up