本文主要是介绍lintcode第一题:A + B 问题 说起python的数字类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述
给出两个整数 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 = 1while carry:s = a ^ bcarry = (a & b) << 1carry = -~(carry - 1) if carry > 0x7FFFFFFF else carrya = sb = carryreturn 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 bif b == 0:return ai = a ^ bj = (a & b) << 1return 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没有限制长整数数值的大小,但实际上由于机器内存有限,长整数数值不可能无限大。(未完待续)
这篇关于lintcode第一题:A + B 问题 说起python的数字类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!