📜  将两个不同基数的整数相加,并以两个较小的基数表示和

📅  最后修改于: 2021-04-22 06:43:49             🧑  作者: Mango

给定分别在基数B1B2中的两个整数XY ,任务是找到整数XY的和,并以( B1B2 )的最小值表示结果。

例子:

方法1:我们的想法是使用基转换,然后找到两个数的总和,以在两者基座10(十进制)的整数转换。然后使用“基数转换”将总和转换为较小的基数B ( B1B2的最小值)。

下面是上述方法的实现:

C++
// Program to find the
// sum of two integers of
// different bases.
#include 
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


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)


输出:
543

方法2:我们可以减少以前方法的转化次数。在这里,我们需要找到较小的基数B ( B1B2的最小值),然后将具有较大基数的整数转换为较小的基数B,并在给定基数的两个整数相加的帮助下将这些整数相加。

下面是上述方法的实现:

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)
输出:
543