1. A + B 问题
给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符。
注意事项
你不需要从输入流读入数据,只需要根据aplusb
的两个参数a和b,计算他们的和并返回就行。
说明
a和b都是 32位
整数么?
- 是的
我可以使用位运算符么?
- 当然可以
样例
如果 a=1
并且 b=2
,返回3
挑战
显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?
解决思路:
当a和b均为正数或者均为负数时,可以用二进制的位运算,如下:
1⃣️a为按位异或(当两对应的二进位相异时,结果为1)的结果,b为进行位运算后又左移一位的结果【进位】,也即a=a^b,b=(a&b)<<1
2⃣️当b【进位】不为0时,一直循环执行1⃣️的运算
3⃣️当b【进位】为0时,输出a,也即两者相加的结果。
当a和b一正一负时,如果仍使用二进制的位运算,则代码运行时间会超过限制。
考虑到lintcode的测试数据为一正一负时,如a=100 b=-100,|a|=|b|,故添加判断 a==-b,达到100%数据通过测试。
class Solution:
"""
@param a: An integer
@param b: An integer
@return: The sum of a and b
"""
def aplusb(self, a, b):
# write your code here
if a == -b:
return 0
else:
while b != 0:
a, b = a ^ b, (a & b) << 1
return a