# Subtraction of two large numbers using 10’s complement

• Difficulty Level : Medium
• Last Updated : 24 Sep, 2021

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 10’s complement.

Example:

Input: N = 10, str1 = “3434243434”, M = 14, str2 = “22324365765767”
Output: 22320931522333

Input: N = 20, str1 = “12345334233242431433”, M = 20, str2 = “12345334233242431432”
Output:

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 + (10’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 10’s complement of str2.
• Now, add 10’s complement of str2 to str1.
• If any carry is generated, then drop the carry.
• 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 calculate the``// subtraction of two large number``// using 10's complement``#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 10's``// complement of given number``string complement10(string v)``{``    ``// Stores the complement``    ``string complement = ``""``;` `    ``// Calculate 9's complement``    ``for` `(``int` `i = 0; i < v.size(); i++) {` `        ``// Subtract every bit from 9``        ``complement += ``'9'` `- v[i] + ``'0'``;``    ``}` `    ``// Add 1 to 9's complement``    ``// to find 10's complement``    ``complement = sumBig(complement, ``"1"``);``    ``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 aren't 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, complement10(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;` `        ``// Erase first bit``        ``it = c.begin();` `        ``c.erase(it);` `        ``// Trim zeros at the beginning``        ``it = c.begin();` `        ``while` `(*it == ``'0'``)``            ``c.erase(it);` `        ``return` `c;``    ``}` `    ``// If both lengths are equal``    ``else` `{``        ``return` `complement10(c);``    ``}``}` `// Driver Code``int` `main()``{` `    ``string str1 = ``"12345334233242431433"``;``    ``string str2 = ``"12345334233242431432"``;` `    ``cout << subtract(str1, str2) << endl;` `    ``return` `0;``}`
Output:
`1`

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

My Personal Notes arrow_drop_up