题目:371. 两整数之和
题目描述:
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
一、核心解题思路
a ^ b可以得到两数相加不进位的加法结果
(a & b) << 1可以得到两数相加产生的进位
二、正确解法
方法一:递归
C++版本:
class Solution {
public:
int getSum(int a, int b) {
if(!(a & b)) return a ^ b;
return getSum(a ^ b,((unsigned int)(a & b)) << 1);
}
};
方法二:迭代
C++版本:
class Solution {
public:
int getSum(int a, int b) {
while(b){
int carry=((unsigned int)(a & b)) << 1; //进位
a^=b; //a作为低位
b=carry; //b作为进位
}
return a;
}
};
Python版本:
class Solution(object):
def getSum(self, a, b):
mask=0x100000000 # 2^32
MAX=0x7FFFFFFF # 整型最大值
MIN=MAX+1
while b !=0:
carry=(a & b)<<1
a=(a ^ b)%mask # 取余范围限制在[0, 2^32-1]内
b=carry%mask
if a<MAX:
return a
else:
return ~((a % MIN)^ MAX)
总结
Notes:
C++
当a & b的结果是负数时,左移就会造成符号位的溢出,所以此处需要转换为unsigned int来避免可能出现的左移越界行为。
Python
主要的难点在于, python整数类型为Unifying Long Integers, 即无限长整数类型。在 Python 中,整数不是 32 位的,也就是说你一直循环左移并不会存在溢出的现象,这就需要我们手动对 Python 中的整数进行处理,手动模拟 32 位 INT 整型。
具体做法是将整数对 0x100000000 取模,保证该数从 32 位开始到最高位都是 0。
python 由于不知道符号位具体是第几位,因此需要进行的操作是:
1.将输入数字转化成无符号整数
2.计算无符号整数相加并的到结果
3.将结果根据范围判定是正数还是负数,映射为有符号整型
欢迎大家扫码关注本人公众号:编程复盘与思考随笔
(关注后可以免费获得本人在csdn发布的资源源码)
公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!