劍指offer 不用加減乘除做加法(java)

2021-07-23 17:40:51 字數 876 閱讀 2343

題目:寫乙個函式,求兩個整數之和,要求在函式體內不得適用+,-,* ,./  四則運算符號

面試的時候被問道這個問題,首先我們分析人們是如何進行十進位制的加法的,比如如何得出5+17=22這個結果的,實際上,我們可以分三步進行:第一步只做各位相加不進製,此時相加的結果是12,第二步做進製,5+7中有進製,進製的值為10;第三步,把前面的兩個結果加起來12+10的結果是22,剛好5+17=22

我們一直在想,求兩個數之和四則運算都不能用,還能用什麼?對數字做運算,除了四則運算之外,也就只剩下位運算了。位運算是針對二進位制的,我們就以二進位制再來分析一下前面的三步走的策略對二進位制是不是也適用。

5的二進位制是101,17的二進位制是10001,還是試著把計算分成三步:第一步各位相加但不計進製,得到的結果是10100;第二步記下進製。在這個例子中只在最後一位相加時產生進製,結果是二進位制的10,第三步把前兩步的結果相加,得到的結果是10110,轉換成十進位制剛好是22,由此可見三步走的策略對二進位制也是適用的。

接下來我們試著把二進位制的加法用位運算來替換。第一步不考慮進製對每一位相加。0+0,1+1的結果都是0,1+0的結果是1。0+1的結果是1,我們注意到這和異或的結果是一樣的。對異或而言,0和0,1和1異或的結果是0,而0和1,1和0的異或結果是1,接著考慮第二步進製,對0+0,0+1,1+0而言,都不會產生進製,只有1+1時,會向前差生乙個進製。此時我們可以想象成是兩個數先做位與運算,然後再向前左移動一位。只有兩個數都是1的時候,位與得到的結果是1,其餘都是0。第三步相加的過程是重複前面的兩步,直到不產生進製為止。

public int add(int num1,int num2)while(num2!=0);  

return num1;

}

劍指offer 不用加減乘除做加法

題目描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。輸入 輸入可能包含多個測試樣例。對於每個測試案例,輸入為兩個整數m和n 1 m,n 1000000 輸出 對應每個測試案例,輸出m n的值。樣例輸入 3 4 7 9樣例輸出 7 16思路 1 先將各bit位相加,不計進製,這...

劍指offer 不用加減乘除做加法

題目描述 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。思路 本道題用乙個例子講解可能會更為清晰點。現舉5 7 12的例子來說明 1.將兩個數字轉化為二進位制 5 0101 7 0111,將兩個數做異或操作 即相當於加法的不進製操作 5 7 0101 0111 0101 2.計算...

劍指offer 不用加減乘除做加法

題意 寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。分析 之前自己手動yy了一下,直接用二進位制進行位運算,然後沒考慮負數,直接wa,接著仔細分析,數分四種情況 a 0,b 0 a 0,b 0 a 0,b 0 a 0,b 0 然後計算,注意進製或者借位的情況就ok了,比較複雜。c...