面试遇到了一个问题,是自己实现一个pow(x,n)函数返回一个值,是x的n次幂,回想当时回答的不好,就是死板的直接while 一直乘下去,面试官始不太满意,我想也是,这也太简单了,可是当时死活也想不出怎么优化,刚一出门,想到了一个降低计算次数的方法
比如,4的11次方,我们可以看做是4的5次方 乘以 4的五次方 乘以 4
这样问题就化简为2种情况
指数为单数时,结果= x的n/2次方 * x的n/2次方 * x;
指数为双数时,结果=x的n/2次方 * x的n/2次方
这样循环累乘的次数缩小了一半
以下是我自己写的实现:
public double myPow(double x, int n) {
if(n < 0){
x = 1/x;
n = -n;
}else if( n == 0){
return 1;
}
int r1 = n/2;
boolean isDouble = n % 2 == 0;
double result = 1;
while(r1 > 0){
result *= x;
r1 --;
}
return isDouble? result*result:result*result*x;
}