1. 程式人生 > 實用技巧 >劍指 Offer 65. 不用加減乘除做加法

劍指 Offer 65. 不用加減乘除做加法

題目描述

寫一個函式,求兩個整數之和,要求在函式體內不得使用 “+”、“-”、“*”、“/” 四則運算子號。

示例:

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

提示:

a, b 均可能是負數或 0
結果不會溢位 32 位整數

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof

思路解析

a b 當前位 進位
0 0 0 0
1 0 1 0
0 1 1 0
1 1 0 1

記當前位為digit,進位為c,有以下關係:digit = a ^ bc = a & b


則加法運算的結果可表示為:digit + (c << 1)
不斷使用這種方式計算加法的進位和當前位,直至進位為0為止。

注意:負數的左移運算在C++中是被禁止的,需要將c的型別顯示轉換為unsigned int

程式碼實現

class Solution {
public:
    int add(int a, int b) {
        while(b) {
            int c = (unsigned int)(a & b) << 1;
            a ^= b;
            b = c;
        }
        return a;
    }
};