LeetCode每日一题(一)

LeetCode每日一题(一)

面试题65. 不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

示例:

输入: a = 1, b = 1
输出: 2

提示:

  • a, b 均可能是负数或 0
  • 结果不会溢出 32 位整数
/*先把两个数各个位相加,比如a=1011,b=1110
 *   1.先不管进位,只做每个位数的相加
 *       1011
 *     + 1110
 *     = 0101
 *   2.这时,我们再看进位和,第一位和第三位都需要进位
 *       0010
 *     + 0010
 *     = 0100
 * -------------------
 *       1000
 *    +  1000
 *    = 10000
 *   第二步的和为 0100+10000 = 10100
 *
 *   3.然后将第一步和第二步的值进行相加 0101+10100= 11001
 *
 * 第一步使用 异或运算( ^,各位数比较,相等为0,不相等为1) (1)a ^ b
 * 第二步,需要进位的位数都是1才会进位,使用 & (如果都为1,则返回1),然后 向右移一位,<<1 (2) a&b<<1
 *       1011
 *     ^ 1110
 *     = 1010
 *  <<1 10100
 * 到了第三步,我们如何不使用加法才能相加第一步和第二步的值呢?
 * 第三步就是前两步的和,如果不使用加法,我们就一直需要调用前两步的步骤
 *
 * a+b=(a^b)+(a&b<<1)  c=(a^b) d=(a&b<<1)
 * a+b = c+d;
 * 现在我们需要计算c+d
 * c+d=(c^d)+(c&d<<1)  e=(c^d) f=(c&d<<1)
 * c+d=e+f
 * .....
 * 以此循环,我们需要循环到什么时候就可以停止了呢,当进位和等于0的时候,我们就可以停止了
 * */
public static int add(int a, int b) {
    while (b != 0) {
        int temp = a ^ b;
        int temp2 = (a & b) << 1;
        a = temp;
        b = temp2;
    }
    return a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值