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: 22320931522333Input: 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 + (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++ Program to calculate the // subtraction of two large number // using 10's complement #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 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;
} |
# Python3 Program to calculate the # subtraction of two large number # using 10's complement # Function to return sums of two # large numbers given as strsings def sumsBig(a, b):
# Compare their lengths
if ( len (a) > len (b)):
temp = a;
a = b;
b = temp;
# Stores the result
strs = "";
# Store the respective lengths
n1 = len (a)
n2 = len (b);
diff = n2 - n1;
# Initialize carry
carry = 0 ;
# Traverse from end of both strsings
for i in range (n1 - 1 , - 1 , - 1 ):
# Compute sums of
# current digits and carry
sums = ( int (a[i]) + int (b[i + diff]) + carry);
# Store the result
strs + = str (sums % 10 );
# Update carry
carry = int (sums / 10 );
# Add remaining digits of strs2[]
for i in range (n2 - n1 - 1 , - 1 , - 1 ):
sums = ( int (b[i]) + carry);
strs + = str (sums % 10 );
carry = int (sums / 10 );
# Add remaining carry
if (carry > 0 ):
strs + = str (carry);
# Reverse resultant strsing
strs = strs[:: - 1 ]
return strs;
# Function return 10's # complement of given number def complement10(v):
# Stores the complement
complement = "";
# Calculate 9's complement
for i in range ( len (v)):
# Subtract every bit from 9
complement + = str ( 9 - int (v[i]));
# Add 1 to 9's complement
# to find 10's complement
complement = sumsBig(complement, "1" );
return complement;
# Function returns subtraction # of two given numbers as strsings def subtract(a, b):
# If second strsing is larger
if ( len (a) < len (b)):
temp = b;
b = a ;
a = temp;
# Calculate respective lengths
l1 = len (a)
l2 = len (b);
# If lengths aren't equal
diffLen = l1 - l2;
for i in range (diffLen):
# Insert 0's to the beginning
# of b to make both the lengths equal
b = "0" + b;
# Add (complement of B) and A
c = sumsBig(a, complement10(b));
# If length of new strsing is greater
# than length of first strsing,
# than carry is generated
if ( len (c) > len (a)):
# Erase first bit
c = c[ 1 ::];
# Trim zeros at the beginning
while (c[ 0 ] = = '0' ):
c = c[ 1 ::]
return c;
# If both lengths are equal
else :
return complement10(c);
# Driver Code strs1 = "12345334233242431433" ;
strs2 = "12345334233242431432" ;
print (subtract(strs1, strs2));
# This code is contributed by phasing17. |
// C# Program to calculate the // subtraction of two large number // using 10's complement using System;
using System.Linq;
using System.Collections.Generic;
class GFG
{ // Function to return sum of two
// large numbers given as strings
static string sumBig( string a, string b)
{
// Compare their lengths
if (a.Length > b.Length)
{
string temp = b;
b = a;
a = temp;
}
// 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 += ( char )(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 += ( char )(sum % 10 + '0' );
carry = sum / 10;
}
// Add remaining carry
if (carry != 0)
str += ( char )(carry + '0' );
// Reverse resultant string
char [] strs = str.ToCharArray();
Array.Reverse(strs);
return new string (strs);
}
// Function return 10's
// complement of given number
static string complement10( string v)
{
// Stores the complement
string complement = "" ;
// Calculate 9's complement
for ( int i = 0; i < v.Length; i++) {
// Subtract every bit from 9
complement += ( char )( '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
static string subtract( string a, string b)
{
// If second string is larger
if (a.Length < b.Length)
{
var t = b;
b = a;
a = t;
}
// 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) {
var c1 = c.ToCharArray().ToList();
// Erase first bit
c1.RemoveAt(0);
// Trim zeros at the beginning
while (c1[0] == '0' )
c1.RemoveAt(0);
return new string (c1.ToArray());
}
// If both lengths are equal
else {
return complement10(c);
}
}
// Driver Code
public static void Main( string [] args)
{
string str1 = "12345334233242431433" ;
string str2 = "12345334233242431432" ;
Console.WriteLine(subtract(str1, str2));
}
} // This code is contributed by phasing17. |
// JS Program to calculate the // subtraction of two large number // using 10's complement // Function to return sum of two // large numbers given as strings function sumBig(a, b)
{ // Compare their lengths
if (a.length > b.length)
{
let temp = a;
a = b;
b = temp;
}
// Stores the result
let str = "" ;
// Store the respective lengths
let n1 = a.length, n2 = b.length;
let diff = n2 - n1;
// Initialize carry
let carry = 0;
// Traverse from end of both strings
for (let i = n1 - 1; i >= 0; i--) {
// Compute sum of
// current digits and carry
let sum
= (parseInt(a[i])
+ parseInt(b[i + diff]) + carry);
// Store the result
str += (sum % 10).toString();
// Update carry
carry = Math.floor(sum / 10);
}
// Add remaining digits of str2[]
for (let i = n2 - n1 - 1; i >= 0; i--) {
let sum = ( parseInt(b[i]) + carry);
str += (sum % 10).toString();
carry = Math.floor(sum / 10);
}
// Add remaining carry
if (carry > 0)
str += (carry).toString();
// Reverse resultant string
str = str.split( "" ).reverse().join( "" )
return str;
} // Function return 10's // complement of given number function complement10(v)
{ // Stores the complement
let complement = "" ;
// Calculate 9's complement
for ( var i = 0; i < v.length; i++) {
// Subtract every bit from 9
complement += (9 - parseInt(v[i])).toString();
}
// 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 function subtract(a, b)
{ // If second string is larger
if (a.length < b.length)
{
let temp = b;
b = a ;
a = temp;
}
// Calculate respective lengths
let l1 = a.length, l2 = b.length;
// If lengths aren't equal
let diffLen = l1 - l2;
for (let 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
let 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) {
// Erase first bit
c = c.substr(1);
// Trim zeros at the beginning
while (c[0] == '0')
c = c.substr(1)
return c;
}
// If both lengths are equal
else {
return complement10(c);
}
} // Driver Code let str1 = "12345334233242431433" ;
let str2 = "12345334233242431432" ;
console.log(subtract(str1, str2)); // This code is contributed by phasing17. |
// Java Program to calculate the // subtraction of two large number // using 10's complement import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
// Function to return sum of two large numbers given as
// strings
public static String sumBig(String a, String b)
{
// Compare their lengths
if (a.length() > b.length()) {
String c = a;
a = b;
b = c;
}
// 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.charAt(i) - '0' )
+ (b.charAt(i + diff) - '0' ) + carry);
// Store the result
str += ( char )(sum % 10 + '0' );
// Update carry
carry = sum / 10 ;
}
// Add remaining digits of b
for ( int i = n2 - n1 - 1 ; i >= 0 ; i--) {
int sum = ((b.charAt(i) - '0' ) + carry);
str += ( char )(sum % 10 + '0' );
carry = sum / 10 ;
}
// Add remaining carry
if (carry > 0 )
str += ( char )(carry + '0' );
// Reverse resultant string
StringBuilder sb = new StringBuilder(str);
sb.reverse();
return sb.toString();
}
// Function to return 10's complement of given number
public static String complement10(String v)
{
// Stores the complement
String complement = "" ;
// Calculate 9's complement
for ( int i = 0 ; i < v.length(); i++) {
// Subtract every bit from 9
complement += ( char )( '9' - v.charAt(i) + '0' );
}
// Add 1 to 9's complement to find 10's complement
complement = sumBig(complement, "1" );
return complement;
}
// Function to return subtraction of two given numbers
// as strings
public static String subtract(String a, String b)
{
// If second string is larger
if (a.length() < b.length()) {
String c = a;
a = b;
b = c;
}
// 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, then carry is generated
if (c.length() > a.length()) {
// Erase first bit
c = c.substring( 1 );
// Trim zeros at the beginning
while (c.charAt( 0 ) == '0' )
c = c.substring( 1 );
return c;
}
else {
// If both lengths are equal
return complement10(c);
}
}
// Driver's Code
public static void main(String[] args)
{
String str1 = "12345334233242431433" ;
String str2 = "12345334233242431432" ;
System.out.println(subtract(str1, str2));
}
} |
1
Time Complexity: O(max(N, M))
Auxiliary Space: O(max(N, M))