一.问题描述
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example 1:
Input: a = 1, b = 2
Output: 3
Example 2:
Input: a = -2, b = 3
Output: 1
二.解题思路
如果这道题你不用类似 sum([a,b] 这种取巧的操作,而是真正实现出题者想要考察的地方,你会发现这道题还是有点东西的。
这道题要求对计算机底层的计算有所了解。
计算机在底层进行数值计算的时候都是先将数用补码表示,然后再从计算完之后再转换成源码返回。
具体相关的可以参考这篇博客。
https://blog.csdn.net/u011240016/article/details/52433355
最重要的一点就是这个:
加法:
整数: [A]补 + [B]补 = [A+B]补 (mod 2^(n+1))
小数: [A]补 + [B]补 = [A+B]补 (mod 2)
减法:
整数: [A-B]补 = [A]补 + [-B]补 (mod 2^(n+1))
小数: [A-B]补 = [A]补 + [-B]补(mod 2)
————————————————
版权声明:本文为CSDN博主「DrCrypto」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011240016/article/details/52433355
可知通过补码,其实加减法都是加法。
因此我们只需要实现加法。
加法来说就是,两个数相与得到需要进位的地方,
然后将进位与上面两数想加的结果进行想加,同样的方法计算进位,
直到进位为0.
注意的地方有2点:
1.python不像C++ Java, 麻烦的一点是数值其实是没有位数限制的,要命的是题目也没给 数的范围, 根据C++那边的情况,应该是32位整型。
2.注意一下如果进位超过第32位说明数值溢出,截取一下。
更多leetcode算法题解法: 专栏 leetcode算法从零到结束
三.源码
class Solution:
#47
def getSum(self, a: int, b: int) -> int:
# Prevent negative number
while b & 0xffffffff: # b & 0xffffffff will remain the same as b with 32 bit
c = a & b
a = a ^ b
b = c << 1
return a & 0xffffffff if b > 0xffffffff else a