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 = 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没有限制长整数数值的大小,但实际上由于机器内存有限,长整数数值不可能无限大。(未完待续)

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值