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

51 篇文章 1 订阅
50 篇文章 28 订阅

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值