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); } };
相关文章推荐
- LintCode_001_A+B问题
- LintCode-A + B 问题
- 排颜色问题——数组 leetcode lintcode
- LintCode-Fizz Buzz问题
- lintcode -- 背包问题
- Lintcode:A + B 问题
- LintCode 1.A+B问题
- lintcode 二叉树的层次遍历系列问题 -解决方法和领会
- LintCode :背包问题
- LintCode编程题:吹气球问题
- LintCode:背包问题 II
- Lintcode:Fizz Buzz 问题
- LintCode-(1)A + B 问题
- lintcode--背包问题II
- LintCode A+B问题
- LintCode A+b问题
- LintCode 1. A + B 问题
- lintcode第一题 A+B问题
- LintCode python 小白-简单题-457经典二分查找问题
- LintCode 关于排序问题的总结