题目:不用加减乘除做加法。
思路:
转换为二进制,分三步走。
第一步:不考虑进位对每一位相加。0+0=0,1+1=0,1+0=1,0+1=1,即用异或运算就可以解决。
第二步:考虑进位,只有当1+1时会向前产生一个进位。这时可以想象成两个数先进行按位与,然后再左移一位。
第三步:把前两步的结果相加(即开始递归),直到最终结果不产生进位(即两个数先进行按位与,然后再左移一位后的结果为0)为止。
//两种写法
#include<iostream>
using namespace std;
class Solution {
public:
//int add(int a, int b)
//{
// return (b == 0) ? a : add(a^b, (a&b) << 1);
//}
int add(int a, int b)
{
int sum, carry;//sum为不考虑进位的结果,carry为位于并左移一位的结果
do
{
sum = a^b;
carry = (a&b) << 1;
a = sum;
b = carry;
} while (carry);
return sum;
}
};