劍指Offer之不用加減乘除做加法

2021-10-07 03:55:56 字數 940 閱讀 4661

題目描述:

寫乙個函式,求兩個整數之和,要求在函式體內不得使用 「+」、「-」、「*」、「/」 四則運算符號。

思路分析:

2個十進位制數相加,和 = 【 對應位置數字相加的和 + 低位置在該位置的進製】;二進位制相加也是一樣,設2個二進位制數a,b:

sum = a + b(不計進製),carry = 進製;

將上次的sum 和 進製carry<<1相加,結果賦值給sum ,carry = 新產生的進製;

重複2,直到進製carry=0;

第1步的加法做完之後,如果還有進製,那麼就表示這兩個數的加法操作還沒完,還要將上次計算的和加上上次的進製,而上次的和加上進製又有可能產生進製,所以後面的操作就是一直加進制,直到不產生進製為止。

因為低位的進製的1在下次計算時在高位計算,所以要<<1;

關於二進位制的 :sum = a + b(不考慮進製)= a ^ b; 例如:

二進位制的a

二進位制的b

和(不考慮進製)01

1101

0001

10可以看到:對應位置的兩個數字相等,結果為0,不相等,結果為1,和異或的結果相同。

關於進製:carry = a & b

二進位制的a

二進位制的b進製0

1010

0000

111可以看到:2個數字中對應位置只有都是1時,才產生進製,和兩個數字&的結果相同。

public

intadd

(int a,

int b)

return sum;

}

小結:

此題相加的過程、還有相加的2個規律弄懂了,基本上就ok了,剛開始在這方面花了不少時間。

劍指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...