欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[剑指offer]不用加减乘除做加法

程序员文章站 2022-06-17 16:16:14
...

[剑指offer]不用加减乘除做加法

剑指offer-不用加减乘除做加法

题目描述

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

示例:
输入: a = 1, b = 1
输出: 2

提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数

解题思路
  • 无进位的求和, 想象10进制下的模拟情况:如19+1=20,无进位求和就是10,而非20,因为它不管进位情况
  • 进位数的和,想象10进制下模拟情况:如9+1=10,得到的进位数为1,而不是10,所以要用<<1向左再移动一位,就变为10了

设两数字的二进制形式 a, b ,其求和 s = a + b,a(i) 代表 a 的二进制第 i 位,则分为以下四种情况:

a[i] b[i] 进位和c(i) 非进位和n(i)
0 0 0 0
0 1 0 1
1 0 1 0
1 1 1 0

可以发现 进位和与运算 逻辑相同,非进位和异或运算 逻辑相同,因此无进位和 n 和进位和 c 的计算公式为:
{n=aba>0c=a&b<<1a0+\begin{cases} n=a\oplus b \qquad & a \gt 0 非进位和:异或运算 \\ c=a\&b<<1 \qquad & a \le 0 进位:与运算+左移一位 \end{cases}
即可转化为:
s=n+c(和s)=(非进位和n)+(进位和c)
[剑指offer]不用加减乘除做加法

实现代码
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;
    }
};