剑指offer上的题目,在牛客网上刷题通过,下面记录相关思路。
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
问题分析
求幂运算需要注意以下几种情况:
- 指数为0
- 指数为负
- 底数为0,指数为负时不符合规定(分母不能为0)
常规求幂运算采用循环或者递归的方法,时间复杂度为O(n),效率不高,这里介绍快速幂算法。
例如求4^11,将指数11写成二进制形式为1011,11 = 1x2^3 + 1x2^1 + 1x2^0,则4^11 = 4^(2^3) x 4^(2^1) x 4^(2^0) = 4^8 x 4^2 x 4^1。最后得到的表达式的三个乘积项,分别对应于指数的二进制位中的三个非0位。由此可见,对于指数的每一个二进制位,如果该位为1,则将其所对应的项乘进去,而每往高位进一位,对应的项就翻倍(变为前一项的平方),最后连乘所得到的结果即为最终的幂。这就是快速幂算法。
对比与普通的求幂方法,快速幂算法的循环次数为指数的二进制表示的有效位数,即log(n),时间效率较高。
