LeetCode每日一題(一)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章