剑指offer(十二)——数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
题解
这道题简单直接的方法有Java的Math.power()API求解。不然就自己写一个函数,注意exponent有可能是负数。
一解:
public static double Power(double base, int exponent) {
return Math.pow(base, exponent);
}
二解:
public static double Power(double base, int exponent) {
double result = 1;
int n = Math.abs(exponent);
while(n-- != 0) {
result *= base;
}
return exponent < 0 ? 1/result : result;
}
以上两种解法都是O(n)的时间复杂度,下面学习一下朋友的快速幂解法,时间复杂度为O(logn)。
三解:
public static double Power(double base, int exponent) {
double ans = 1;
int n = Math.abs(exponent);
while(n != 0) {
if (n % 2 == 1) {
ans *= base;
}
base *= base;
n /= 2;
}
return exponent > 0 ? ans : 1/ans;
}
我们在计算an 时,利用分治法可知,当n为奇数时,an = an/2 x an/2 x a;当n为偶数时, an = an/2 x an/2 。以此类推,an/4,an/8。因此利用这个关系,我们就可以找到更快的计算幂的方法,那就是让底数不断变大,指数不断变小,从而求得解。