LintCode - A + B 問題(普通)
版權宣告:本文參考網路文章。
難度:普通
要求:
給出兩個整數a和b, 求他們的和, 但不能使用 +等數學運算子。
** 注意事項
你不需要從輸入流讀入資料,只需要根據aplusb的兩個引數a和b,計算他們的和並返回就行。
說明
a和b都是 32位
整數麼?
是的
我可以使用位運算子麼?
當然可以
樣例如果 a=1並且 b=2,返回3
思路:
用位運算實現加法也就是計算機用二進位制進行運算,32位的CPU只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進位的基礎上,如下
1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0
很明顯這幾個表示式可以用位運算的“^”來代替,如下
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
這樣我們就完成了簡單的一位數加法,那麼要進行二位的加法,這個方法可行不可行呢?肯定是不行的,矛盾就在於,如何去獲取進位?要獲取進位我們可以如下思考:
0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1
//換個角度看就是這樣
0 & 0 = 不進位
1 & 0 = 不進位
0 & 1 = 不進位
1 & 1 = 進位
正好,在位運算中,我們用“<<”表示向左移動一位,也就是“進位”。那麼我們就可以得到如下的表示式
//進位可以用如下表示:
(x&y)<<1
到這裡,我們基本上擁有了這樣兩個表示式
x^y //執行加法
(x&y)<<1 //進位操作
現總結如下:
定理1:
設a,b為兩個二進位制數,則a+b = a^b + (a&b)<<1。證明:a^b是不考慮進位時加法結果。當二進位制位同時為1時,才有進位,因此 (a&b)<<1是進位產生的值,稱為進位補償。將兩者相加便是完整加法結果。
定理2:
使用定理1可以實現只用位運算進行加法運算。證明:利用定理1中的等式不停對自身進行迭代。每迭代一次,進位補償右邊就多一位0,因此最多需要加數二進位制位長度次迭代,進位補償就變為0,這時運算結束。
class Solution {
/*
* param a: The first integer
* param b: The second integer
* return: The sum of a and b
*/
public int aplusb(int a, int b) {
// write your code here, try to do it without arithmetic operators.
if(a==0)return b;
if(b==0)return a;
int x = a^b; //記錄不進位數
int y = (a&b)<<1; //記錄進位數
return aplusb(x,y); //然後遞迴 上述不進位結果 + 進位結果,最終進位為0,則返回最終結果
}
};
相關文章
- LintCode-A+B Problem
- LintCode - 等價二叉樹(普通)二叉樹
- 【Lintcode】1322. Product Equal B
- [LintCode] Parking Lot 停車場問題
- A+B 演算法問題演算法
- Python入門:A+B問題Python
- 打家劫舍問題合集(普通、有環、二叉樹)二叉樹
- 【面試普通人VS高手系列】b樹和b+樹的理解面試
- 常見問題--oracle普通使用者啟用autoraceOracle
- 跨域問題(普通跨域和springsecurity跨域)跨域SpringGse
- 領釦LintCode演算法問題答案-1343. 兩字串和演算法字串
- 如何解決B/S中的列印問題?
- 2024數模b題-問題一思路構建
- 領釦LintCode演算法問題答案-988. 硬幣擺放演算法
- 領釦LintCode演算法問題答案-1895. 安排面試城市演算法面試
- Linux Centos 普通使用者無法登陸SSH 問題LinuxCentOS
- Linux CentOS普通使用者無法登陸SSH問題LinuxCentOS
- 2024數模b題-問題三思路構建
- 領釦LintCode演算法問題答案-77. 最長公共子序列演算法
- 領釦LintCode演算法問題答案-1878. 旋轉數字演算法
- 領釦LintCode演算法問題答案-1886. 目標移動演算法
- 領釦LintCode演算法問題答案-1320. 包含重複值演算法
- Lintcode539 Move Zeroes solution 題解
- Lintcode22 Flatten List solution 題解
- Lintcode387 The Smallest Difference solution 題解
- Oracle Database將普通錶轉換為分割槽表遇到的問題OracleDatabase
- 領釦LintCode演算法問題答案-1225. 島的周長演算法
- WIndows NT服務和普通程式之間大資料傳輸問題Windows大資料
- Lintcode515 Paint House solution 題解AI
- 領釦LintCode演算法問題答案-1876. 外星人字典(簡單)演算法
- 面試問題 - 只用位操作在ABAP裡實現a+b面試
- llamafactory框架下微調llama3-70b推理問題框架
- 利用線上重定義功能將普通錶轉換為分割槽表問題
- 領釦LintCode演算法問題答案-1214. 許可證金鑰格式演算法
- lintcode演算法題 落單的數 JavaScript演算法JavaScript
- 普通關機 文藝關機 2B關機的區別
- [PAT B] 1008 陣列元素迴圈右移問題陣列
- CF22B 最大子矩陣問題簡單版矩陣