二进制之和
问题描述
小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。
测试样例
样例1:
输入:binary1 = "101" ,binary2 = "110"
输出:'11'
样例2:
输入:binary1 = "111111" ,binary2 = "10100"
输出:'83'
样例3:
输入:binary1 = "111010101001001011" ,binary2 = "100010101001"
输出:'242420'
样例4:
输入:binary1 = "111010101001011" ,binary2 = "10010101001"
输出:'31220'
样例5:
输入:binary1 = "11" ,binary2 = "1"
输出:'4'
解题思路
- 方法一:先转换为十进制后相加
我们可以编写一个二进制转十进制的函数,先将binary1和binary2转换为十进制数,再将它们相加,最后输出十进制结果。 - 方法二:直接按二进制规则相加
也可以直接运用二进制相加的特性,得到二进制的相加结果,然后再使用 Python 的int(binary, 2)函数将二进制字符串转换为十进制数,得到最终结果。 - 方法三:使用 Python 内置函数暴力求解
Python 提供了强大的内置函数,可以通过一行代码直接解决问题,省去了手动转换的麻烦。
具体实现
方法一:先转换为十进制后相加
- 编写一个函数,将二进制数转为十进制数;
- 将两个二进制数转换为十进制后相加;
- 输出最终的十进制结果。
方法二:直接按二进制规则相加
- 直接使用 Python 的
int(binary, 2)函数将二进制数转换为十进制数; - 对两个十进制数进行相加,得到结果;
- 输出相加后的结果。
方法三:使用 Python 内置函数
- 利用 Python 内置函数,直接将两个二进制字符串进行相加并转换为十进制;
- 输出最终结果。
PS:最终输出结果为字符串格式。
代码实现
方法一:
def solution(binary1, binary2):
m = d(binary1)
n = d(binary2)
return str(m + n)
def d(binary_str):
decimal_value = 0
power = 0
# 从最低位开始处理
for bit in reversed(binary_str):
# 将当前位转换为整数并与2的power次方相乘
decimal_value += int(bit) * (2 ** power)
# 增加权重
power += 1
return decimal_value
方法二:
def binary_sum(binary1, binary2):
# 反转字符串,方便从最低位开始加
binary1 = binary1[::-1]
binary2 = binary2[::-1]
max_len = max(len(binary1), len(binary2))
carry = 0
result = []
for i in range(max_len):
# 获取当前位的数字,若当前位不存在,则为0
bit1 = int(binary1[i]) if i < len(binary1) else 0
bit2 = int(binary2[i]) if i < len(binary2) else 0
# 当前位的和与进位
total = bit1 + bit2 + carry
result.append(str(total % 2)) # 当前位
carry = total // 2 # 更新进位
# 如果还有进位,则需要追加一位
if carry:
result.append('1')
# 反转结果并返回十进制的字符串形式
return str(int(''.join(result[::-1]), 2))
方法三:
def solution(binary1, binary2):
return str(int(binary1, 2) + int(binary2, 2))
进制转换:
1. 十进制转化成2、8、16进制:
- 10 --> 2:
bin(3)返回"0b11",表示数字 3 的二进制形式。 - 10 --> 8:
oct(10)返回"0o12",表示数字 10 的八进制形式。 - 10 --> 16:
hex(255)返回"0xff",表示数字 255 的十六进制形式。
2. 2、8、16进制转化为十进制:
- 2 --> 10:
int('0b11', 2)返回 3,将二进制字符串"0b11"转换为十进制数。 - 8 --> 10:
int('0o12', 8)返回 10,将八进制字符串"0o12"转换为十进制数。 - 16 --> 10:
int('0x11', 16)返回 17,将十六进制字符串"0x11"转换为十进制数。
print("10 --> 2:",bin(3))
print("10 --> 8:",oct(10))
print("10 --> 16:",hex(255))
print("2 --> 10:",int('0b11', 2))
print("8 --> 10:",int('0o12', 8))
print("16 --> 10:",int('0xff', 16))
3. 二进制、八进制、十六进制表示:
- 在表示二进制时,数字前缀为
0b(大小写均可)。 - 在表示八进制时,数字前缀为
0o(大小写均可)。 - 在表示十六进制时,数字前缀为
0x(大小写均可)。
4. 使用eval函数执行字符串:
eval('0b11')返回 3,执行二进制字符串的计算。eval('0o12')返回 10,执行八进制字符串的计算。eval('0x11')返回 17,执行十六进制字符串的计算。
print(eval('0b11'))
print(eval('0o12'))
print(eval('0xff'))