问题描述
给出两个整数 aa 和 bb , 求他们的和。
挑战
显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)
正确答案
__AUTHOR = "tyltr"
__DATE = "18-2-28 下午9:27 "
"""
001.给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符
"""
class Solution:
"""
@param a: An integer
@param b: An integer
@return: The sum of a and b
"""
def aplusb(self, a, b):
carry = 1
while carry:
s = a ^ b
carry = (a & b) << 1
carry = -~(carry - 1) if carry > 0x7FFFFFFF else carry
a = s
b = carry
return a
初看这个题目很简单,用java c等语言实现很easy,但是对于python却有一个很大很大的坑。
首先,先看看错误的做法吧!
class Solution:
"""
@param a: An integer
@param b: An integer
@return: The sum of a and b
"""
def aplusb(self, a, b):
if a == 0:
return b
if b == 0:
return a
i = a ^ b
j = (a & b) << 1
return self.aplusb(i, j)
if __name__ == '__main__':
sol = Solution()
print(sol.aplusb(-1, 100))
上面的代码看似没有什么问题,在其他语言都是按照这个思路写的。在测试正数加正数的时候,确实也能正确的计算。但是一旦其中一个加数换成了负数,如上述代码中 -1 + 100 那么问题就来了。
当输入的参数中包含负数的时候,会报错:
RecursionError: maximum recursion depth exceeded in comparison
您是否也出现了这类的问题呢?
解析
后来经过研究,发现问题的原因。是因为python 和其他语言如java等,在存储数值的实现机制不同造成的。
不知道您有没有这种主观的感受:python开发过程中,没有出现过int类型的“溢出”。例如:a=11111111111111111111111111
是因为python中的整型类型,一旦达到即将发生“溢出”时,就会被转换成long类型。Python的长整数(long)是没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,长整数数值不可能无限大。(未完待续)