数值的整数次方——jzoffer

第三章 高质量的代码,面试题16,page110

关于面试题目,如果要求是任意大的数字,那么这道题目就是一个大数问题,此时我们需要特殊的数据结构来表示数字,比如用字符串或者数组来表示大的数字,以确保不会溢出。

首先要考虑的是普通功能测试的测试用例

其次需要考虑各种边界值的测试用例。例如递归终止边界

最后还需要考虑各种可能的错误输入,负面测试用例

题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题

我们使用右移运算符代替了除以2,用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数。位运算的效率比乘除法及求余运算的效率要高很多。

g_invalid_input = False
class Solution:

    def power_with_unsigned_exponent(self, base, exponent):
        '''指数为非负的次方操作'''
        result = 1.0 # 如果指数为0,那么无论底数为任何数,结果为1,底数为0时也同样
        for _ in range(exponent):
            result *= base
        return result
    
    def fast_power_with_unsigned_exponent(self, base, exponent):
        '''指数为非负的次方操作,使用递归,速度更快'''
        if exponent == 0:
            return 1.0
        if exponent == 1:
            return base
        ret = self.fast_power_with_unsigned_exponent(base, exponent >> 1)
        ret *= ret
        if exponent & 0x1:
            ret = ret * base
        return ret
    
    def power(self, base, exponent):
        global Solution.g_invalid_input
        # 每次调用前要将全局变量错误标识初始化
        g_invalid_input = False
        if base = 0 and exponent < 0:
            g_invalid_input = True
            return 0.0
        unsigned_exponent = exponent if exponent >= 0 else -exponent
        ret = self.power_with_unsigned_exponent(base, unsigned_exponent)
        if exponent < 0:
            ret = 1.0 / ret
        return ret    

你可能感兴趣的:(数值的整数次方——jzoffer)