剑指offer——数值的整数次方
问题描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路分析
这道题不是很难。但是需要考虑的因素很多。
设最终结果为result
情况一:当为0次方时,
result=1;
情况二:当为正整数次方时,没什么问题。
result*=base;
情况三:当为负整数次方时,先对指数求绝对值,算出结果再取倒数。
注:因为要求倒数,考虑0求倒数的情况,会导致程序出错。
(此时,有三种办法解决。返回值、全局变量和异常处理。)
代码
public class Solution {
public double Power(double base, int exponent) {
double result = 1.0;
if(exponent == 0){
return 1;
}
else if(exponent > 0){
for(int i = 1;i <= exponent;i++){
result *= base;
}
}
else {
if (base == 0)
return -1;
for (int i = 1; i <= -exponent; i++) {
result *= base;
}
}
return exponent > 0 ? result : 1.0/result;
}
}
此题还应该考虑效率问题,在计算时,如求
2
4
2^4
24时,可计算为
2
2
∗
2
2
2^2*2^2
22∗22。所以可以考虑运用公式递归来提高效率。
a
n
=
{
a
n
/
2
∗
a
n
/
2
n
=
偶
数
a
(
n
−
1
)
/
2
∗
a
(
n
−
1
)
/
2
∗
a
n
=
奇
数
a^n = \begin{cases} a^{n/2}*a^{n/2} & n=偶数 \\ a^{(n-1)/2}*a^{(n-1)/2} *a& n=奇数 \end{cases}
an={an/2∗an/2a(n−1)/2∗a(n−1)/2∗an=偶数n=奇数
再进一步优化,计算n/2时,用n>>1来替代。具体代码省略。