??前面的話??
大家好!本篇文章將介紹的劍指offerOJ題,來自力扣劍指 Offer 65. 不用加減乘除做加法題解,展示代碼語言暫時為:Java,C,C++,
📒博客主頁:未見花聞的博客主頁
🎉歡迎關注🔎點贊👍收藏??留言📝
📌本文由未見花聞原創,CSDN首發!
📆首發時間:🌴2021年12月10日🌴
??堅持和努力一定能換來詩與遠方!
💭刷題推薦書籍:📚《劍指offer專項版》,📚《劍指offer第2版》
💬參考在線編程網站:🌐牛客網🌐力扣
博主的碼云gitee,平常博主寫的程式代碼都在里面,
博主的github,平常博主寫的程式代碼都在里面,
🙏作者水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
📌導航小助手📌
- ??劍指 Offer 65. 不用加減乘除做加法??
- 🔐題目詳情
- 💡解題思路
- 🔑源代碼
- 🌱總結

??劍指 Offer 65. 不用加減乘除做加法??
🔐題目詳情
寫一個函式,求兩個整數之和,要求在函式體內不得使用 “ + ” 、 “ ? ” 、 “ ? ” 、 “ / ” “+”、“-”、“*”、“/” “+”、“?”、“?”、“/”四則運算子號,
示例:
輸入: a = 1, b = 1
輸出: 2
輸入: a = 5, b = 6
輸出: 11
提示:
- a, b 均可能是負數或 0,
- 結果不會溢位 32 位整數,
| 來源:力扣(LeetCode)鏈接:劍指 Offer 65. 不用加減乘除做加法 |
|---|
💡解題思路
方法1:你說不能使用加減乘除運算子?我偏要用,直接將兩數相加回傳,
方法2:位運算,
預備知識:
- 按位與 & :雙目運算子,對每位取與,都為1則為1,否則為0,
- 按位異或 ^ :雙目運算子,對每位取異或,對應位兩數不相同為1,否則為0,
- 左移 << :雙目運算子,a << b ,表示將a的二進制位左移b位,最右邊補0,
- 加法進位的特點:對于二進制,發生進位的條件是兩個數所對應的二進制位均為1,
解題思路:


實作a,b兩數完整加法的步驟:
- 將a與b按位與并左移一位,即(a & b) << 1,不妨將此結果存至變數tmp,若此數值為0,就表示兩數未發生進位,
- 將a與b進行非進位加法,即a ^ b,不妨將此結果賦值給a,將上面所得tmp值賦值給b,
- 此時b的值為tmp,判斷b是否為0,若b不為0,需要進位,重復上述步驟,將進位數b與前一次非進位加法的值非進位相加,若b為0,不需要進位,加法程序結束,最終結果即a的值,
注意:C/C++對負數左移存在溢位,先將 a & b 強轉為 unsigned int 以保護左移溢位的情況!

🔑源代碼
Java:
class Solution {
public int getSum(int a, int b) {
//兩數異或相當于不進位相加,兩數按位與運算能夠得到需要進位的數,將此數左移再異或相加,直到該數為0,加法計算完畢
while (b != 0) {
int tmp = (a & b) << 1;
a ^= b;
b = tmp;
}
return a;
}
}
C:
int getSum(int a, int b){
while (b) {
int tmp = (unsigned int)(a & b) << 1;//C/C++,負數情況,對有符號數左移存在溢位,先轉無符號再左移對溢位情況保護處理
a ^= b;
b = tmp;
}
return a;
}
C++:
class Solution {
public:
int getSum(int a, int b) {
while (b) {
int tmp = (unsigned int)(a & b) << 1;
a ^= b;
b = tmp;
}
return a;
}
};
🌱總結
不用加減乘除做加法,最容易想到的方法就是位運算,通過了解各種位運算的特點,找出模擬加法的適當方法,
力扣同源題:
371. 兩整數之和
面試題 17.01. 不用加號的加法
力扣類似題:
面試題 08.05. 遞回乘法
29. 兩數相除
50. Pow(x, n)
69. Sqrt(x)
面試題 16.07. 最大數值

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/379471.html
標籤:java
下一篇:新專案如何技術選型以及落地實作
