LintCode_001_A+B问题
2017-10-29 13:23
393 查看
问题描述
给出两个整数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); } };
相关文章推荐
- LintCode_001_A+B问题
- LintCode:背包问题 II
- LintCode 1. A + B 问题
- LintCode编程题:吹气球问题
- LintCode:背包问题
- lintcode刷题 A + B 问题 位运算
- LintCode A+B问题
- LintCode-Fizz Buzz问题
- lintcode-背包问题-92
- lintcode fizz buzz问题
- LintCode 33-N皇后问题
- Lintcode:A + B 问题
- LintCode-A + B 问题
- LintCode——1. A + B 问题
- Lintcode--001(比较字符串)
- LintCode-(1)A + B 问题
- Lintcode:Fizz Buzz 问题
- lintcode backpack 背包问题
- Lint-code 用栈模拟汉诺塔问题
- LintCode 链表求和 问题解答