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

`// 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;` `}` |

**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****.**