【算法题】不使用加减乘除符号计算两数之和a+b
参考博客1:http://blog.csdn.net/morewindows/article/details/8710737
参考博客2:http://blog.csdn.net/morewindows/article/details/7354571
有关题目:leetcode371
1、a+b
—–假设在十进制的情况下,5+7的进位是1,不进位和是2,最后的结果是1*10+2=12,所以在二进制的情况下,也可以这样做。
—–假设a=3,b=6,则a+b=3+6
a 0011 =3
b 0110 =6
不进位和 0101 =5
进位 0010 =2
—–于是变成5+2*2,即5+2<<1,
a 0101 =5
b 0100 =2<<1
不进位和 0001 =1
进位 0100 =4
—–接着又变成1+4*2,即1+4<<1,
a 0001 =1
b 1000 =1<<1
不进位和 1001 =9
进位 0000 =0
—–至此,不再有进位,所以结果为9。
—–c++代码如下:
int getSum(int a, int b)
{
while (b != 0)
{
int temp = a^b;//得到不进位和
b = (a&b) << 1;//得到进位后左移一位
a = temp;
}
return a;
}
—–Python代码如下,但是提交超时:
def getSum(a, b):
while(b != 0):
temp = a^b
b = (a&b) << 1
a = temp
return a
—–修改Python代码如下,
def getSum(a, b):
mymax = 0x7FFFFFFF
mymin = 0x80000000
mask = 0xFFFFFFFF
while(b != 0):
temp = (a^b) & mask
b = ((a&b) << 1) & mask
a = temp
if a<= mymax:
return a
else:
return ~(a ^ mask)
2、a+b*5
—–这种情况就是将其转化为加法,然后按照上述方法即可。比如a+ b * 5 = a + b * 4 + b = a + b << 2 + b。然后按照上述方法即可。
—–c++代码如下:
int getMul(int a, int b ,int n) {
int tempb = b << (n / 2);
while (b != 0)
{
int temp = a^b;
b = (a&b) << 1;
a = temp;
}
while (tempb != 0)
{
int temp = a^tempb;
tempb = (a&tempb) << 1;
a = temp;
}
return a;
}