原题链接 : 二进制之和 - 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) # 输出结果
当然,这样做的话这道题就失去意义了,我们还是考虑一下如何自行实现
分析步骤
-
输入:
- 两个二进制字符串
a和b。
- 两个二进制字符串
-
输出:
- 两个二进制字符串相加后的十进制结果。
-
步骤:
- 从最低位开始逐位相加,处理进位。
- 将相加结果转换为十进制整数。
- 将结果转换为字符串并返回。
有哪些要注意的地方?一是进位的表示,二是要考虑两个字符串不等长的情形,较长的字符串的高位部分应当特别处理,与进位相加后合并入最终结果。否则最终结果会缺失高位部分。
具体实现过程中,可以这样做:
-
反转字符串:
- 反转字符串
a和b以便从最低位开始相加。
- 反转字符串
-
逐位相加:
- 遍历最长字符串的长度,逐位相加两个二进制字符串的对应位,并处理进位。
-
处理进位:
- 使用变量记录进位,如果最高位有进位,添加到结果中。
-
处理高位
- 将未做计算的高位并入
-
转换结果为十进制:
- 将二进制结果转换为十进制整数,并返回字符串形式的结果。
最终实现代码如下:
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)