Given two numeric Hexadecimal numbers **str1 **and str2, the task is to add the two hexadecimal numbers.
Hexadecimal Number_ system, often shortened to “hex”, is a number system made up from 16 symbols. it uses 10 symbols from decimal number system which are represented by 0-9 and six extra symbols A – F which represent decimal 10 – 15._
Examples:
Input:_ str1 = “01B”, str2 = “378”_
Output:_ 393_
Explanation:
B (11 in decimal) + 8 =19_(13 in hex), hence addition bit = 3, carry = 1_
1 + 7 + 1 (carry) = 9, hence addition bit = 9, carry = 0
0 + 3 + 0 (carry) = 3, hence addition bit = 3, carry = 0
01B + 378 = 393
_Input: _str1 = “AD”, str2 = “1B”
_Output: _C8
Explanation:
D(13 in Dec) + B(11 in Dec) = 24(18 in hex), hence addition bit = 8, carry = 1
A(10 in Dec) + 1 + 1 (carry)= 12 (C in hex), addition bit = C carry = 0
_AD + 1B = C8 _
Approach: The idea is to use a map template to store the mapped values that are hexadecimal to decimal and decimal to hexadecimal.
Below is the implementation of the above approach:
// C++ program for the above approach
#include <bits/stdc++.h>
**using**
**namespace**
std;
// Map for converting hexadecimal
// values to decimal
map<``**char**``,
**int**``> hex_value_of_dec(``**void**``)
{
// Map the values to decimal values
map<``**char**``,
**int**``> m{ {
'0'``, 0 }, {
'1'``, 1 },
{
'2'``, 2 }, {
'3'``, 3 },
{
'4'``, 4 }, {
'5'``, 5 },
{
'6'``, 6 }, {
'7'``, 7 },
{
'8'``, 8 }, {
'9'``, 9 },
{
'A'``, 10 }, {
'B'``, 11 },
{
'C'``, 12 }, {
'D'``, 13 },
{
'E'``, 14 }, {
'F'``, 15 } };
**return**
m;
}
// Map for converting decimal values
// to hexadecimal
map<``**int**``,
**char**``> dec_value_of_hex(``**void**``)
{
// Map the values to the
// hexadecimal values
map<``**int**``,
**char**``> m{ { 0,
'0'
}, { 1,
'1'
},
{ 2,
'2'
}, { 3,
'3'
},
{ 4,
'4'
}, { 5,
'5'
},
{ 6,
'6'
}, { 7,
'7'
},
{ 8,
'8'
}, { 9,
'9'
},
{ 10,
'A'
}, { 11,
'B'
},
{ 12,
'C'
}, { 13,
'D'
},
{ 14,
'E'
}, { 15,
'F'
} };
**return**
m;
}
// Function to add the two hexadecimal numbers
string Add_Hex(string a, string b)
{
map<``**char**``,
**int**``> m = hex_value_of_dec();
map<``**int**``,
**char**``> k = dec_value_of_hex();
// Check if length of string first is
// greater than or equal to string second
**if**
(a.length() < b.length())
swap(a, b);
// Store length of both strings
**int**
l1 = a.length(), l2 = b.length();
string ans =
""``;
// Initialize carry as zero
**int**
carry = 0, i, j;
// Traverse till second string
// get traversal completely
**for**
(i = l1 - 1, j = l2 - 1;
j >= 0; i--, j--) {
// Decimal value of element at a[i]
// Decimal value of element at b[i]
**int**
sum = m[a[i]] + m[b[j]] + carry;
// Hexadecimal value of sum%16
// to get addition bit
**int**
addition_bit = k[sum % 16];
// Add addition_bit to answer
ans.push_back(addition_bit);
// Update carry
carry = sum / 16;
}
// Traverse remaining element
// of string a
**while**
(i >= 0) {
// Decimal value of element
// at a[i]
**int**
sum = m[a[i]] + carry;
// Hexadecimal value of sum%16
// to get addition bit
**int**
addition_bit = k[sum % 16];
// Add addition_bit to answer
ans.push_back(addition_bit);
// Update carry
carry = sum / 16;
i--;
}
// Check if still carry remains
**if**
(carry) {
ans.push_back(k[carry]);
}
// Reverse the final string
// for desired output
reverse(ans.begin(), ans.end());
// Return the answer
**return**
ans;
}
// Driver Code
**int**
main(``**void**``)
{
// Initialize the hexadecimal values
string str1 =
"1B"``, str2 =
"AD"``;
// Function call
cout << Add_Hex(str1, str2) << endl;
}
Output:
C8
Time Complexity: O(max(N, M)), where the length of the string first and second is N and M.
Auxiliary Space:O(max(N, M)), where the length of the string first and second is N and M.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
#hash #mathematical #strings #base-conversion #numbers