🚩传送门:牛客题目
力扣题目

题目

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

示例:

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

解题思路:模拟

利用自增、自减运算符完成

  1. public class Solution {
  2. public int Add(int num1,int num2) {
  3. // num1 正数
  4. if(num1>0)
  5. while(num1--!=0) num2++;
  6. else
  7. while(num1++!=0) num2--;
  8. return num2;
  9. }
  10. }

解题思路:位运算

设两数字的二进制形式 [NC]258. 不用加减乘除做加法 - 图1 ,其求和 [NC]258. 不用加减乘除做加法 - 图2[NC]258. 不用加减乘除做加法 - 图3 代表 [NC]258. 不用加减乘除做加法 - 图4 的二进制第 [NC]258. 不用加减乘除做加法 - 图5 位,则分为以下四种情况:
image.png
观察发现,无进位和异或运算 规律相同,进位与运算 规律相同(并需左移一位)。

因此,无进位和 [NC]258. 不用加减乘除做加法 - 图7 与进位 [NC]258. 不用加减乘除做加法 - 图8 的计算公式如下:
[NC]258. 不用加减乘除做加法 - 图9

🚩将 [NC]258. 不用加减乘除做加法 - 图10 转化为 [NC]258. 不用加减乘除做加法 - 图11[NC]258. 不用加减乘除做加法 - 图12

循环求 [NC]258. 不用加减乘除做加法 - 图13[NC]258. 不用加减乘除做加法 - 图14 ,直至进位 [NC]258. 不用加减乘除做加法 - 图15 ;此时 [NC]258. 不用加减乘除做加法 - 图16 ,返回 [NC]258. 不用加减乘除做加法 - 图17 即可。
[NC]258. 不用加减乘除做加法 - 图18
在计算机系统中,数值一律用 补码 来表示和存储。

补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法同时适用于正数和负数的加法 。

复杂度分析

时间复杂度:[NC]258. 不用加减乘除做加法 - 图19,最差情况下(例如 [NC]258. 不用加减乘除做加法 - 图20 , [NC]258. 不用加减乘除做加法 - 图21 时),需循环 32 次

空间复杂度:[NC]258. 不用加减乘除做加法 - 图22, 使用常数大小的额外空间。

官方代码

class Solution {
    public int add(int a, int b) {
        // b 为进位,当进位为 0 时跳出
        while(b != 0) { 
            int tempb = (a & b) << 1;  // 临时进位
            a ^= b;                    // a 无进位和
            b = tempb;                 // b 新的进位
        }
        return a;
    }
}