美文网首页
数值的整数次方——jzoffer

数值的整数次方——jzoffer

作者: 二十岁的弹簧 | 来源:发表于2018-12-16 09:47 被阅读0次

    第三章 高质量的代码,面试题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

          本文链接:https://www.haomeiwen.com/subject/unytkqtx.html