songyy5517 / DataStructures-Algorithms

0 stars 0 forks source link

剑指 Offer 65: 不用加减乘除做加法 #72

Open songyy5517 opened 1 year ago

songyy5517 commented 1 year ago

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

示例:

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

分析 一开始并没有什么头绪,但运算符一共就那么几个。我首先想到了二进制的加法,其中共包含4种情况:

songyy5517 commented 1 year ago

思路:分解加法 & 位运算

  1. 循环计算两数之和,直到不产生进位:
    • 异或两个数(二进制)得到结果 $xor$ ;(不能直接赋给 $num1$ ,因为会影响下一步与的结果)
    • 两个数取与,再左移1位,得到结果2,并直接赋值给 $num2$ ;
    • 将 $xor$ 赋给 $num1$ 。
  2. 返回 $num1$ 。

复杂度分析

songyy5517 commented 1 year ago
import java.util.*;
public class Solution {
    public int Add(int num1,int num2) {
        // 思路:一开始有点没头绪。但运算符一共就那么几个。
        // 我首先想到了二进制的加法,通过例子,决定使用XOR操作实现加法。

        while (num2 != 0){
            int carry = num1 ^ num2;    // 相加
            num2 = (num2 & num1) << 1;    // 进位
            num1 = carry;
        }

        return num1;
    }
}
songyy5517 commented 1 year ago

Key points

  1. 将加法分解成三步;
  2. 相加不进位:^;
  3. 进位:& << 1
songyy5517 commented 6 months ago

2024/4/23