剑指offer48__不用加减乘除做加法_题解

不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

示例1

输入

1,2

返回值

3

分析

方案一:位运算

无进位和异或运算规律相同,进位与运算规律相同(并需左移一位)

无进位和 \(n\) 与进位 \(c\) 的计算公式如下

\[\begin{cases} n=a⊕b\\ c=(a\&b)<<1 \end{cases} \]

算法步骤

  1. 计算 \(a\)\(b\) 的无进位和 \(n\) 和进位 \(c\)
  2. 如果进位 \(c\) 不为 0,说明 \(a+b\) 的结果等于无进位和+进位,此时,把无进位和赋值给 \(a\),进位赋值给 \(b\) ,继续计算
  3. 如果进位等于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;
    }
};
posted @ 2021-01-23 19:42  RiverCold  阅读(37)  评论(0编辑  收藏  举报