Add two integers of different base and represent sum in smaller base of the two
Given two integers X, Y in base B1 and B2 respectively, the task is to find the sum of integers X and Y and represent the result in min of ( B1 and B2 ).
Example:
Input: X = 123, Y = 234, B1 = 6, B2 = 8
Output: 543
Explanation:
Integer in base 10: 51 and 156
Sum of Integers: 207
Minimum Base: 6
Sum of Integer in Base 6 = 543Input: X = 16, Y = 24, B1 = 9, B2 = 7
Output: 45
Explanation:
Minimum Base: 7
Integer in base 7: 21 and 24
Sum of Integer in Base 6 –
2 1
+ 2 4
—————-
4 5
Approach 1: The idea is to convert both integers in base 10 ( decimal ) using Base Conversion, then find the sum of the two numbers. The sum is then converted into smaller base B ( minimum of B1 and B2 ) using Base Conversion.
Below is the implementation of the above approach:
C++
// Program to find the // sum of two integers of // different bases. #include <bits/stdc++.h> using namespace std; int val( char c) { if (c >= '0' && c <= '9' ) return ( int )c - '0' ; else return ( int )c - 'A' + 10; } int convert(string num, int base) { int len = (num.size()); // Initialize power of base int power = 1; // Initialize result int res = 0; int i; // Decimal equivalent is str[len-1]*1 + // str[len-2]*base + str[len-3]*(base^2) + ... for (i = len - 1; i >= 0; i--) { res += val(num[i]) * power; power = power * base; } return res; } int dec_to_base( int num, int base) { // Maximum base - 36 string base_num = "" ; while (num > 0) { int dig = int (num % base); if (dig < 10) base_num += to_string(dig); else base_num += to_string( 'A' + dig - 10); num /= base; } // To reverse the string reverse(base_num.begin(), base_num.end()); return stoi(base_num); } // Driver Code int main() { string a = "123" ; string b = "234" ; int base_a = 6; int base_b = 8; // Integer in base 10 int a10 = convert(a, base_a); int b10 = convert(b, base_b); // Sum of integers int summ = a10 + b10; // uncomment to check // intermediate value // of a and b to base 10 // print(a10, b10) // Minimum Base int min_base = min(base_a, base_b); // Sum of integers in Min Base cout << (dec_to_base(summ, min_base)); } // This code is contributed by grand_master |
Java
// Java Program to find the // sum of two integers of // different bases. import java.util.*; class GFG { static int val( char c) { if (c >= '0' && c <= '9' ) return ( int )c - '0' ; else return ( int )c - 'A' + 10 ; } static int convert(String num, int bases) { int len = (num.length()); // Initialize power of base int power = 1 ; // Initialize result int res = 0 ; int i; // Decimal equivalent is str[len-1]*1 + // str[len-2]*base + str[len-3]*(base^2) + ... for (i = len - 1 ; i >= 0 ; i--) { res += val(num.charAt(i)) * power; power = power * bases; } return res; } static void dec_to_base( int num, int bases) { // Maximum base - 36 // String base_num = ""; StringBuilder base_num = new StringBuilder(); while (num > 0 ) { int dig = (num % bases); if (dig < 10 ) base_num.append(String.valueOf(dig)); else base_num.append( String.valueOf(( 'A' + dig - 10 ))); num /= bases; } // print ans in reverse order for ( int i = base_num.length() - 1 ; i >= 0 ; i--) System.out.print(base_num.charAt(i)); } // Driver Code public static void main(String[] args) { String a = "123" ; String b = "234" ; int base_a = 6 ; int base_b = 8 ; // Integer in base 10 int a10 = convert(a, base_a); int b10 = convert(b, base_b); // Sum of integers int summ = a10 + b10; // uncomment to check // intermediate value // of a and b to base 10 // print(a10, b10) // Minimum Base int min_base = Math.min(base_a, base_b); // Sum of integers in Min Base dec_to_base(summ, min_base); } } // This code is contributed by ukasp. |
Python
# Program to find the # sum of two integers of # different bases. # Base conversion def dec_to_base(num, base): # Maximum base - 36 base_num = "" while num > 0 : dig = int (num % base) if dig < 10 : base_num + = str (dig) else : # Using uppercase letters base_num + = chr ( ord ( 'A' ) + dig - 10 ) num / / = base # To reverse the string base_num = base_num[:: - 1 ] return int (base_num) # Driver Code a = '123' b = '234' base_a = 6 base_b = 8 # Integer in base 10 a10 = int (a, base_a) b10 = int (b, base_b) # Sum of integers summ = a10 + b10; # uncomment to check # intermediate value # of a and b to base 10 # print(a10, b10) # Minimum Base min_base = min (base_a, base_b) # Sum of integers in Min Base print (dec_to_base(summ, min_base)) |
C#
// C# Program to find the // sum of two integers of // different bases. using System.Collections.Generic; using System; using System.Linq; using System.Text; class GFG { static int val( char c) { if (c >= '0' && c <= '9' ) return ( int )c - '0' ; else return ( int )c - 'A' + 10; } static int convert( string num, int bases) { int len = (num.Length); // Initialize power of base int power = 1; // Initialize result int res = 0; int i; // Decimal equivalent is str[len-1]*1 + // str[len-2]*base + str[len-3]*(base^2) + ... for (i = len - 1; i >= 0; i--) { res += val(num[i]) * power; power = power * bases; } return res; } static void dec_to_base( int num, int bases) { // Maximum base - 36 // String base_num = ""; var base_num = new StringBuilder(); while (num > 0) { int dig = (num % bases); if (dig < 10) base_num .Append(dig.ToString()); else base_num .Append( ( 'A' + dig - 10).ToString()); num /= bases; } // print ans in reverse order for ( int i = base_num.Length - 1; i >= 0; i--) Console.Write(base_num[i]); } // Driver Code public static void Main(String[] args) { String a = "123" ; String b = "234" ; int base_a = 6; int base_b = 8; // Integer in base 10 int a10 = convert(a, base_a); int b10 = convert(b, base_b); // Sum of integers int summ = a10 + b10; // uncomment to check // intermediate value // of a and b to base 10 // print(a10, b10) // Minimum Base int min_base = Math.Min(base_a, base_b); // Sum of integers in Min Base dec_to_base(summ, min_base); } } // This code is contributed by amreshkumar3 |
Javascript
<script> // Javascript Program to find the // sum of two integers of // different bases. function val(c) { if (c >= '0' && c <= '9' ) return c.charCodeAt(0) - '0' .charCodeAt(0); else return c.charCodeAt(0) - 'A' .charCodeAt(0) + 10; } function convert(num,bases) { let len = (num.length); // Initialize power of base let power = 1; // Initialize result let res = 0; let i; // Decimal equivalent is str[len-1]*1 + // str[len-2]*base + str[len-3]*(base^2) + ... for (i = len - 1; i >= 0; i--) { res += val(num[i]) * power; power = power * bases; } return res; } function dec_to_base(num,bases) { // Maximum base - 36 // String base_num = ""; let base_num = []; while (num > 0) { let dig = (num % bases); if (dig < 10) base_num.push((dig).toString()); else base_num.append( ( 'A' .charCodeAt(0) + dig - 10).toString()); num = Math.floor(num/bases); } // print ans in reverse order for (let i = base_num.length - 1; i >= 0; i--) document.write(base_num[i]); } // Driver Code let a = "123" ; let b = "234" ; let base_a = 6; let base_b = 8; // Integer in base 10 let a10 = convert(a, base_a); let b10 = convert(b, base_b); // Sum of integers let summ = a10 + b10; // uncomment to check // intermediate value // of a and b to base 10 // print(a10, b10) // Minimum Base let min_base = Math.min(base_a, base_b); // Sum of integers in Min Base dec_to_base(summ, min_base); // This code is contributed by avanitrachhadiya2155 </script> |
543
Time Complexity: O(logN)
Auxiliary Space: O(1)
Approach 2: We can reduce the number of conversions from the previous approach. Here we need to find the smaller base B ( minimum of B1 and B2 ), then convert the integer with a larger base to smaller base B and add the integers with help of the Addition of two integers of given base.
Below is the implementation of the above approach:
C++
// C++ code for the above approach #include <bits/stdc++.h> using namespace std; // Program to find the // sum of two integers of // different bases. // Base conversion int dec_to_base( int num, int base) { // Maximum base - 36 string base_num = "" ; while (num > 0){ int dig = ((num % base) + base) % base; if (dig < 10) base_num += to_string(dig); else { // Using uppercase letters base_num += ( 'A' + (dig - 10)); } num = (num/base); } // To reverse the string reverse(base_num.begin(), base_num.end()); return stoi(base_num); } // Function to find the sum of // two integers of base B string sumBase(string a, string b, int base){ int len_a = a.length(); int len_b = b.length(); string s = "" ; string sum = "" ; int diff = abs (len_a - len_b); // Padding 0 in front of the // number to make both numbers equal for ( int i = 1; i < diff + 1; i++){ s += "0" ; } // Condition to check if the strings // have lengths mis-match if (len_a < len_b) a = s + a; else b = s + b; int carry = 0; // Loop to find the find the sum // of two integers of base B for ( int i = max(len_a, len_b) - 1; i >= 0; i--){ // Current Place value for // the resultant sum int a1 = a[i] - '0' ; int b1 = b[i] - '0' ; int curr = carry + a1 + b1; // Update carry carry = (curr / base); // Find current digit curr = (curr % base + base) % base; // Update sum result sum = to_string(curr) + sum; } if (carry > 0) sum = to_string(carry) + sum; return sum; } // Driver Code int main() { string a = "123" ; string b = "234" ; int base_a = 6; int base_b = 8; int min_Base = 0; // Convert the integer with // large base to smaller base B if (base_a > base_b){ min_Base = base_b; int a10 = stoi(a, 0, base_a); a = dec_to_base(a10, base_b); } else { min_Base = base_a; int b10 = stoi(b, 0, base_b); b = dec_to_base(b10, base_a); } // Sum of Integer in min_Base string sum = sumBase(a, b, min_Base); cout << sum << endl; } // This code is contributed by phasing17 |
Java
// Java code for the above approach import java.util.*; class GFG { // Program to find the // sum of two integers of // different bases. // Method to reverse a String static String Reverse(String s) { // create a StringBuilder object StringBuilder sb = new StringBuilder(); //append s to sb sb.append(s); // reverse sb sb.reverse(); return new String(sb); } // base conversion static int dec_to_base( int num, int base1) { // Maximum base - 36 String base_num = "" ; while (num > 0 ) { int dig = ((num % base1) + base1) % base1; if (dig < 10 ) base_num += String.valueOf(dig); else { // Using uppercase letters base_num += ( 'A' + (dig - 10 )); } num = (num / base1); } // To reverse the String base_num = Reverse(base_num); return Integer.valueOf(base_num); } // Function to find the sum of // two integers of base1 B static String sumBase(String a, String b, int base1) { int len_a = a.length(); int len_b = b.length(); String s = "" ; String sum = "" ; int diff = Math.abs(len_a - len_b); // Padding 0 in front of the // number to make both numbers equal for ( int i = 1 ; i < diff + 1 ; i++) { s += "0" ; } // Condition to check if the Strings // have lengths mis-match if (len_a < len_b) a = s + a; else b = s + b; int carry = 0 ; // Loop to find the find the sum // of two integers of base1 B for ( int i = Math.max(len_a, len_b) - 1 ; i >= 0 ; i--) { // Current Place value for // the resultant sum int a1 = a.charAt(i) - '0' ; int b1 = b.charAt(i) - '0' ; int curr = carry + a1 + b1; // Update carry carry = (curr / base1); // Find current digit curr = (curr % base1 + base1) % base1; // Update sum result sum = String.valueOf(curr) + sum; } if (carry > 0 ) sum = String.valueOf(carry) + sum; return sum; } // Driver Code public static void main(String[] args) { String a = "123" ; String b = "234" ; int base_a = 6 ; int base_b = 8 ; int min_Base = 0 ; // Convert the integer with // large base1 to smaller base1 B if (base_a > base_b) { min_Base = base_b; int a10 = Integer.valueOf(a, base_a); a = String.valueOf(dec_to_base(a10, base_b)); } else { min_Base = base_a; int b10 = Integer.valueOf(b, base_b); b = String.valueOf(dec_to_base(b10, base_a)); } // Sum of Integer in min_Base String sum = sumBase(a, b, min_Base); System.out.println(sum); } } // This code is contributed by phasing17 |
Python3
# Program to find the # sum of two integers of # different bases. # Base conversion def dec_to_base(num, base): # Maximum base - 36 base_num = "" while num > 0 : dig = int (num % base) if dig < 10 : base_num + = str (dig) else : # Using uppercase letters base_num + = chr ( ord ( 'A' ) + dig - 10 ) num / / = base # To reverse the string base_num = base_num[:: - 1 ] return int (base_num) # Function to find the sum of # two integers of base B def sumBase(a, b, base): len_a = len (a) len_b = len (b) s = "" sum = "" diff = abs (len_a - len_b) # Padding 0 in front of the # number to make both numbers equal for i in range ( 1 , diff + 1 ): s + = "0" # Condition to check if the strings # have lengths mis-match if (len_a < len_b): a = s + a else : b = s + b carry = 0 # Loop to find the find the sum # of two integers of base B for i in range ( max (len_a, len_b) - 1 , - 1 , - 1 ): # Current Place value for # the resultant sum curr = carry + ( ord (a[i]) - ord ( '0' ))\ + ( ord (b[i]) - ord ( '0' )) # Update carry carry = curr / / base # Find current digit curr = curr % base # Update sum result sum = chr (curr + ord ( '0' )) + sum if (carry > 0 ): sum = chr (carry + ord ( '0' )) + sum return sum # Driver Code a = '123' b = '234' base_a = 6 base_b = 8 # Convert the integer with # large base to smaller base B if base_a > base_b: min_Base = base_b a10 = int (a, base_a) a = dec_to_base(a10, base_b) else : min_Base = base_a b10 = int (b, base_b) b = dec_to_base(b10, base_a) # Sum of Integer in min_Base sum = sumBase( str (a), str (b), min_Base) print ( sum ) |
C#
// C# code for the above approach using System; using System.Collections.Generic; class GFG { // Program to find the // sum of two integers of // different bases. // Method to reverse a string static string Reverse( string s) { char [] charArray = s.ToCharArray(); Array.Reverse(charArray); return new string (charArray); } // base conversion static int dec_to_base( int num, int base1) { // Maximum base - 36 string base_num = "" ; while (num > 0) { int dig = ((num % base1) + base1) % base1; if (dig < 10) base_num += Convert.ToString(dig); else { // Using uppercase letters base_num += ( 'A' + (dig - 10)); } num = (num / base1); } // To reverse the string base_num = Reverse(base_num); return Convert.ToInt32(base_num); } // Function to find the sum of // two integers of base1 B static string sumBase( string a, string b, int base1) { int len_a = a.Length; int len_b = b.Length; string s = "" ; string sum = "" ; int diff = Math.Abs(len_a - len_b); // Padding 0 in front of the // number to make both numbers equal for ( int i = 1; i < diff + 1; i++) { s += "0" ; } // Condition to check if the strings // have lengths mis-match if (len_a < len_b) a = s + a; else b = s + b; int carry = 0; // Loop to find the find the sum // of two integers of base1 B for ( int i = Math.Max(len_a, len_b) - 1; i >= 0; i--) { // Current Place value for // the resultant sum int a1 = a[i] - '0' ; int b1 = b[i] - '0' ; int curr = carry + a1 + b1; // Update carry carry = (curr / base1); // Find current digit curr = (curr % base1 + base1) % base1; // Update sum result sum = Convert.ToString(curr) + sum; } if (carry > 0) sum = Convert.ToString(carry) + sum; return sum; } // Driver Code public static void Main( string [] args) { string a = "123" ; string b = "234" ; int base_a = 6; int base_b = 8; int min_Base = 0; // Convert the integer with // large base1 to smaller base1 B if (base_a > base_b) { min_Base = base_b; int a10 = Convert.ToInt32(a, base_a); a = Convert.ToString(dec_to_base(a10, base_b)); } else { min_Base = base_a; int b10 = Convert.ToInt32(b, base_b); b = Convert.ToString(dec_to_base(b10, base_a)); } // Sum of Integer in min_Base string sum = sumBase(a, b, min_Base); Console.WriteLine(sum); } } // This code is contributed by phasing17 |
Javascript
<script> b // JavaScript code for the above approach // Program to find the // sum of two integers of // different bases. // Base conversion function dec_to_base(num, base){ // Maximum base - 36 let base_num = "" while (num > 0){ let dig = parseInt(num % base) if (dig < 10) base_num += dig.toString() else { // Using uppercase letters base_num += String.fromCharCode( 'A' .charCodeAt(0) + dig - 10) } num = Math.floor(num/base) } // To reverse the string base_num = base_num.split( "" ).reverse().join( "" ) return parseInt(base_num) } // Function to find the sum of // two integers of base B function sumBase(a, b, base){ let len_a = a.length let len_b = b.length let s = "" let sum = "" let diff = Math.abs(len_a - len_b) // Padding 0 in front of the // number to make both numbers equal for (let i=1;i<diff+1;i++){ s += "0" } // Condition to check if the strings // have lengths mis-match if (len_a < len_b) a = s + a else b = s + b let carry = 0 // Loop to find the find the sum // of two integers of base B for (let i = Math.max(len_a, len_b) - 1;i>=0;i--){ // Current Place value for // the resultant sum let curr = carry + (a.charCodeAt(i) - '0' .charCodeAt(0)) + (b.charCodeAt(i) - '0' .charCodeAt(0)) // Update carry carry = Math.floor(curr / base) // Find current digit curr = curr % base // Update sum result sum = String.fromCharCode(curr + '0' .charCodeAt(0)) + sum } if (carry > 0) sum = String.fromCharCode(carry + '0' .charCodeAt(0)) + sum return sum } // Driver Code let a = '123' let b = '234' let base_a = 6 let base_b = 8 let min_Base = 0 // Convert the integer with // large base to smaller base B if (base_a > base_b){ min_Base = base_b let a10 = parseInt(a, base_a) a = dec_to_base(a10, base_b) } else { min_Base = base_a let b10 = parseInt(b, base_b) b = dec_to_base(b10, base_a) } // Sum of Integer in min_Base let sum = sumBase(a.toString(), b.toString(), min_Base) document.write(sum, "</br>" ) // This code is contributed by shinjanpatra </script> |
543
Time Complexity: O(logN)
Auxiliary Space: O(1)
Please Login to comment...