【剑指offer】数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:
这题卡在没想到exponent可以是负数了...
自己想了一个比较好的方法,非递归,O(logN)算法
举例说明吧:设base = 2.5, exponent = 99
我们每次都会把base的幂次加倍
base 1 2.5
base2 base1*base1
base4 base2*base2
base8 base4*base4
base16 base8*base8
base32 base16*base16
base64 base32*base32
在计算的时候,只需要通过base 1* base2* base32 * base64 就可以得到99次幂
但是如何才能知道那个幂次的值需要乘进去,我们想到了exponent的二进制表达
凡是需要乘入的,exponent的二进制表达中那一位一定为1.
所以我们只要每次一平方的时候把判断的位数向后移一位即可。
double Power(double base, int exponent) { if(exponent < 0) //处理负数,这里最开始没想到 卡了很久 { base = 1 / base; exponent = (-exponent); } double d = base; double ans = 1; int bit = 1; while(exponent != 0) { if((exponent & bit) != 0) //如果exponent的当前位是1 { ans *= d; exponent &= (exponent - 1); } d = d * d; bit = bit << 1; } return ans; }
递归版本
double Power(double base, int exponent) { if(exponent < 0) { base = 1 / base; exponent = (-exponent); } if(exponent == 0) return 1; else { double tmp = Power(base, exponent >> 1); if((exponent & 0x1) == 0) return tmp * tmp; else return tmp * tmp * base; } }