1. 程式人生 > 其它 >【劍指offer】65. 不用加減乘除做加法

【劍指offer】65. 不用加減乘除做加法

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

知識點:數學;位運算

題目描述

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

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

解法一:位運算

不能用四則運算,那其實可以用的只要邏輯運算和位運算了,這裡很明顯要用位運算。關鍵怎麼用呢。

我們列一張表其實就可以發現,兩個元素如果沒有進位也就是不是對應位都是1的時候,相加就和異或運算的結果是一樣的;如果有進位,也就是兩位上都是1的時候,相加就是兩者相與然後左移一位;所以我們就可以做了。

可以依次得到兩個數的異或結果和與結果;
sum=a+b=sum+carry;但是求得這兩個後還是要加,由於不能用加法,所以可以再求這兩個結果的與結果和異或結果。直到最後進位的為0,sum就是答案了。

class Solution {
    public int add(int a, int b) {
        int sum = a^b;  //無進位的;
        int carry = (a&b) << 1;  //有進位的;
        while(carry != 0){  //進位為0的時候返回sum;
            a = sum;
            b = carry;
            sum = a^b;
            carry = (a & b) << 1;
        }
        return sum;   
    }
}

相關連結

不用加減乘除做加法(位運算,清晰圖解)