題目描述:
寫乙個函式,求兩個整數之和,要求在函式體內不得使用 「+」、「-」、「*」、「/」 四則運算符號。思路分析:
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...