面试题16:数值的整数次方
小白一枚,仅为记录,欢迎指正!!
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
1.全面但不够高效的解法,需要注意的是边界值:
(1) 当指数为负数时,可以先对指数求绝对值,算出次方的结果后再求倒数;但需要考虑到底数为0,指数为负时,不能除以0
(2) 0的0次方在数学上是没有意义的,输出可以是0或者1,面试时需要说清
代码片1
.
// An highlighted block
public class Solution {
public double Power(double base, int exponent){
boolean flag = false;
double result=1;
if(exponent<0){
if(base==0){
System.out.println("异常:底数为0,指数为负,无意义");
return 0.0;//此时返回的0是异常时的0
}
flag = true;
exponent = Math.abs(exponent);
}
int i = 0;
//此处while可以用代码2代替
while(i<exponent){
result = result*base;
++i;
}
if(flag){
return 1/result;
}else{
return result;
}
}
}
2.既全面又高效的解法,用递归实现,此段代码可以代替while循环
思路: 要计算一个数的32次方,如果已经知道他的16次方的值了,只用把它的16次方的值平方一次就可以了。而16次方又是8的平方,这样依次类推,求一个数的32次方只要进行做5次乘法就够了。
先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,在16次方的基础上求32次方。
代码片2
.
public double baseExponentPower(double base, int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result = baseExponentPower(base, exponent>>1);
result*=result;
if((exponent & 0x1) == 1)
result *= base;
return result;
}
用右移运算代替除以2用位与运算符代替求余运算符%来判断一个数是奇数还是偶数,位运算的效率比乘除及求余的运算要高很多