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