力扣第[57题](快速幂),这一段代码为什么会溢出
2010
2023.03.17
2023.03.18
发布于 未知归属地

今天在做力扣第57题这道题,决定自己动手用递归实现快速幂,我的代码如下:


class Solution:
    def myPow(self, x: float, n: int) -> float:
        if n > 0:
            return self.recur(x, n)
        else:
            return 1.0 / self.recur(x, -n)

    def recur(self, x: float, n: int) -> float:
        if n == 0:
            return 1.0
        else:
            y = self.recur(x, n // 2) ** 2
            return y if n % 2 == 0 else y * x

但是这代码会出现数字超出范围的异常,最后经过比对发现只要将recur函数中的

 y = self.recur(x, n // 2) ** 2
            return y if n % 2 == 0 else y * x

修改为:

            y = self.recur(x, n // 2) 
            return y*y if n % 2 == 0 else y*y * x

就能正常提交,可这是为什么,这两行代码有什么区别吗?

补充提交失败的用例:

x = 2.00000
n = -2147483648
评论 (7)