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: 12345656663329978Input: 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; } |
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.