LintCode 1. A + B Problem

原题

LintCode 1. A + B Problem

Description

Write a function that add two numbers A and B. You should not use + or any arithmetic operators.

Clarification

Are a and b both 32-bit integers?

  • Yes.

Can I use bit operation?

  • Sure you can.

Example

Given a=1 and b=2 return 3

解题

要求不用算术运算符实现加法aplusb,可以使用位运算。
主要是用的异或运算实现。

异或 -> 不进位加法

Example

  • 不需要进位的情况
2 ^ 5
2: 010
5: 101
^ -----
7: 111
  • 需要进位
2 ^ 6
2: 010
6: 110
^ -----
5: 101

这里第二位计算的结果为0是正确的,但是并没有向上一位进。

不进位加法结果:a ^ b

与 -> 进位

接下来的问题就是获取进位

首先知道哪些位置需要进位,需要进位的位置有个特点就是两个数在该位都为1,因此可以通过与运算得出。

Example

2 & 6
2: 010
6: 110
& -----
   010

然后只需要把需要进位的位置左移一位就可以得到进位。

进位:a & b << 1

递归相加

  • 通过异或运算得到了不进位加法结果a ^ b
  • 通过与运算得到了进位a & b << 1

接下来只需要把这两个数加在一起即可,这时候可以选择递归调用aplusb,问题就变为递归何时结束。

在进位的加法过程中,可能产生新的进位,这时继续递归需要调用aplusb。继续这个过程,最终进位会变为0,此时结束递归。

最终代码

class Solution {
public:
    /*
    * @param a: An integer
    * @param b: An integer
    * @return: The sum of a and b
    */
    int aplusb(int a, int b) {
        // write your code here
        if (b == 0) return a;
        return aplusb(a ^ b, (a & b) << 1);
    }
};

你可能感兴趣的:(LintCode 1. A + B Problem)