剑指offer48__不用加减乘除做加法_题解
不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
示例1
输入
1,2
返回值
3
分析
方案一:位运算
无进位和与异或运算规律相同,进位和与运算规律相同(并需左移一位)
无进位和 \(n\) 与进位 \(c\) 的计算公式如下
\[\begin{cases}
n=a⊕b\\
c=(a\&b)<<1
\end{cases}
\]
算法步骤
- 计算 \(a\) 和 \(b\) 的无进位和 \(n\) 和进位 \(c\)
- 如果进位 \(c\) 不为 0,说明 \(a+b\) 的结果等于无进位和+进位,此时,把无进位和赋值给 \(a\),进位赋值给 \(b\) ,继续计算
- 如果进位等于0,说明 \(a+b\) 的结果等于无进位和,返回无进位和即可
代码1
/**
1.时间复杂度:O(n)
2.空间复杂度:O(n)
**/
class Solution
{
public:
int Add(int a, int b)
{
//因为不允许用+号,所以求出异或部分和进位部分依然不能用+号,所以只能循环到没有进位为止
while (b != 0)
{
//保存进位值,下次循环用
int c = (unsigned int)(a & b) << 1; //C++中负数不支持左移位,因为结果是不定的
a ^= b;//保存不进位值,下次循环用
//如果还有进位,再循环,如果没有,则直接输出没有进位部分即可。
b = c;
}
return a;
}
};