劍指 Offer 65. 不用加減乘除做加法
阿新 • • 發佈:2020-09-17
題目描述
寫一個函式,求兩個整數之和,要求在函式體內不得使用 “+”、“-”、“*”、“/” 四則運算子號。
示例:
輸入: 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 ^ b
,c = 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; } };