【算法题】不使用加减乘除符号计算两数之和a+b

来源:互联网 发布:在jsp中写java代码 编辑:程序博客网 时间:2024/05/21 14:03

【算法题】不使用加减乘除符号计算两数之和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;    }
0 0