题目
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。
思路
- 思路很简单,学过数字电路的都明白…bit_a+bit_b生成一个bit_sum和ci(进位)。这题就是要模拟二进制加法,ci = a & b,sum = a ^ b。因为,1+0=0+1=1,0+0=1+1=0,只考虑这一位的话加法和异或是一样的,进位就考察是否a=b=1即可,即a & b=1。再用移位运算之后,加到sum进一位上,如此反复直到不再产生进位。代码很简单,但是Python有些特性,导致遇到负数的时候会有问题。在思考里说。
- 时间复杂度:O(n^2),n位a和n位b相加,进位n次,每次相加n位。
- 空间复杂度:O(1)
代码
思路1:时间复杂度:O(n^2),空间复杂度:O(1)
def add(a, b):
while b:
a, b = (a ^ b) & 0xFFFFFFFF, ((a & b) << 1) & 0xFFFFFFFF
# limit the bit length < 32
return a if a < 0X7fffffff else ~(a ^ 0xFFFFFFFF) # ~(a-1)
思考
- Python数字存储和C++很不一样,有2点:
- 负数bin(-1) = ‘-0b1’
- 数字没有位数限制
- 如果直接照抄书上代码,处理负数的时候就会陷入死循环。
>>> -1 ^ 1
>>> -2
>>> (-1 & 1) << 1
>>> 2
>>> -2 ^ 2
>>> -4
- 原因一开始我以为是负数存储机制的不同,但是经过计算。其实Python中负数存储的值是和C++一样的,只是打印出来的格式有异。问题出在位数限制上,如果在C++中,进位到最高位就会溢出,而Python却不会,而是变成一个更大的数。因此出现了无法停止的循环。
- 解决方法就是,对所有数字 & 0xFFFFFFFF进行限制位数,在打印的时候转换负数。
相同的题目
LeetCode 371. 两整数之和
题目
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1