LeetCode每日一題(一)
面試題65. 不用加減乘除做加法
寫一個函數,求兩個整數之和,要求在函數體內不得使用 “+”、“-”、“*”、“/” 四則運算符號。
示例:
輸入: a = 1, b = 1
輸出: 2
提示:
a
,b
均可能是負數或 0- 結果不會溢出 32 位整數
/*先把兩個數各個位相加,比如a=1011,b=1110
* 1.先不管進位,只做每個位數的相加
* 1011
* + 1110
* = 0101
* 2.這時,我們再看進位和,第一位和第三位都需要進位
* 0010
* + 0010
* = 0100
* -------------------
* 1000
* + 1000
* = 10000
* 第二步的和爲 0100+10000 = 10100
*
* 3.然後將第一步和第二步的值進行相加 0101+10100= 11001
*
* 第一步使用 異或運算( ^,各位數比較,相等爲0,不相等爲1) (1)a ^ b
* 第二步,需要進位的位數都是1纔會進位,使用 & (如果都爲1,則返回1),然後 向右移一位,<<1 (2) a&b<<1
* 1011
* ^ 1110
* = 1010
* <<1 10100
* 到了第三步,我們如何不使用加法才能相加第一步和第二步的值呢?
* 第三步就是前兩步的和,如果不使用加法,我們就一直需要調用前兩步的步驟
*
* a+b=(a^b)+(a&b<<1) c=(a^b) d=(a&b<<1)
* a+b = c+d;
* 現在我們需要計算c+d
* c+d=(c^d)+(c&d<<1) e=(c^d) f=(c&d<<1)
* c+d=e+f
* .....
* 以此循環,我們需要循環到什麼時候就可以停止了呢,當進位和等於0的時候,我們就可以停止了
* */
public static int add(int a, int b) {
while (b != 0) {
int temp = a ^ b;
int temp2 = (a & b) << 1;
a = temp;
b = temp2;
}
return a;
}