您的位置:首页 > 其它

LintCode_001_A+B问题

2017-10-29 13:23 330 查看

问题描述

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

说明

a和b都是 32位 整数么?

是的

我可以使用位运算符么?

当然可以

样例

如果 a=1 并且 b=2,返回3

求解

使用位运算符进行加法运算,异或运算得到和(不含进位),与运算再左移得到进位(carry),和与进位“相加”得到结果。“相加”是对前面过程的又一次调用,可以通过递归或循环来实现。

下面以a = 3,b = 5为例来说明这个过程:

第1次循环,a ^ b 为 0011 ^ 0101 得到 0110,a & b 为 0011 & 0101 得到 0001,这说明最后一位相加时需要进位,将 0001 左移得到0010,进入下一个循环;

第2次循环,a ^ b 为 0110 ^ 0010 得到 0100,a & b 为 0110 & 0010 得到 0010,这说明倒数第二位相加时需要进位,将 0010 左移得到0100,进入下一个循环;

第3次循环,a ^ b 为 0100 ^ 0100 得到 0000,a & b 为 0100 & 0100 得到 0100,这说明倒数第三位相加时需要进位,将 0100 左移得到1000,进入下一个循环;

第4次循环,a ^ b 为 0000 ^ 1000 得到 1000,a & b 为 0000 & 1000 得到 0000,这说明没有哪个位需要进位,此时跳出循环,1000即为最终结果。

首次写代码时把判断条件写成了b > 0导致出错,因为漏掉了负数的情况

// Time:  O(logn) = O(32)
// Space: O(1)

class Solution {
public:
/*
* @param a: The first integer
* @param b: The second integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
while (b != 0) {
int sum = a ^ b;
int carry = (a & b) << 1;
a = sum;
b = carry;
}
return a;
}
};

class Solution2 {
public:
/*
* @param a: The first integer
* @param b: The second integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
if (b == 0) {
return a;
}
return aplusb(a ^ b, (a & b) << 1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: