二进制之和 - MarsCode | 豆包MarsCode AI刷题

32 阅读3分钟

原题链接 : 二进制之和 - MarsCode

二进制之和

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

问题分析

如果使用python实现本题,其实有极为简单的一个写法,因为python整数是支持指定基数的,只要将整数的基数指定为2(二进制),就可以很方便的实现转化:

def add_binary_strings(a, b):
    # 将二进制字符串转换为十进制整数
    num1 = int(a, 2)
    num2 = int(b, 2)
    
    # 相加两个十进制整数
    sum_decimal = num1 + num2
    
    # 将结果转换为字符串并返回
    return str(sum_decimal)

# 示例输入
a = "1101"
b = "1011"

# 计算二进制字符串的十进制求和结果
result = add_binary_strings(a, b)
print(result)  # 输出结果

当然,这样做的话这道题就失去意义了,我们还是考虑一下如何自行实现

分析步骤

  1. 输入

    • 两个二进制字符串 a 和 b
  2. 输出

    • 两个二进制字符串相加后的十进制结果。
  3. 步骤

    • 从最低位开始逐位相加,处理进位。
    • 将相加结果转换为十进制整数。
    • 将结果转换为字符串并返回。

有哪些要注意的地方?一是进位的表示,二是要考虑两个字符串不等长的情形,较长的字符串的高位部分应当特别处理,与进位相加后合并入最终结果。否则最终结果会缺失高位部分。

具体实现过程中,可以这样做:

  1. 反转字符串

    • 反转字符串 a 和 b 以便从最低位开始相加。
  2. 逐位相加

    • 遍历最长字符串的长度,逐位相加两个二进制字符串的对应位,并处理进位。
  3. 处理进位

    • 使用变量记录进位,如果最高位有进位,添加到结果中。
  4. 处理高位

    • 将未做计算的高位并入
  5. 转换结果为十进制

    • 将二进制结果转换为十进制整数,并返回字符串形式的结果。

最终实现代码如下:

ef solution(binary1, binary2):
    # Please write your code here
    binary1 = ''.join(reversed(binary1))
    binary2 = ''.join(reversed(binary2))

    if len(binary2) > len(binary1):
        temp = binary2
        binary2 = binary1
        binary1 = temp
        #确保总是b1最长
    
    e = 0 #进位
    b3 = []
    for i in range(len(binary2)):
        ib1 = int(binary1[i]) 
        ib2 = int(binary2[i]) 

        b3.append((ib1 + ib2 + e)%2)

        e = (ib1 + ib2 + e) // 2
    
    t = len(binary2)
    
    while(e!=0 or t < len(binary1)):
        
        if t < len(binary1):
            ib1 = int(binary1[t])
            b3.append((e + ib1)%2)
            e = (ib1 + e) // 2
        else:
            b3.append(e)
            e = 0
        t += 1
    
    b3 = reversed(b3)
    binary_result = ''.join(map(str, b3))
    
    decimal_result = int(binary_result, 2)
    
    return str(decimal_result)