数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
Math.pow函数可以达到要求,但题目明确要求不能使用库函数。
最简单的解法-一个循环,遍历exponent次,base不断的乘自己。注意考虑临界情况:负数,0,上代码。
//最简单的循环,不断相乘
public static double myPower(double base,int exponent){
// 临界情况 -0的负数次方
if(base == 0 && exponent <0){
return 0;
}
// 临界情况-负数先取正值
int absExponent = exponent;
if(exponent<0){
absExponent=-exponent;
}
double ans = 1;
for(int i = 0;i<absExponent;i++){
ans = ans*base;
}
// 临界情况-结果集需要取倒数
if(exponent<0){
ans=1/ans;
}
return ans;
}
其实上面遍历过程中,有些重复的计算,如果输入的指数为32时,则上面的函数需要做31次乘法,但我们可以换一种思路考虑:我们的目标是32次方,当我们已知base的16次方,那么只要在16次方的基础上再平方一次就可以了,而16次方是8次方的平方,这样以此类推,求32次方只需要做5次乘法,base2–>(base2)2–>(base4)2–>(base8)2–>(base16)2。如果是奇数,按照上面的步骤求完平方,再多乘一次自己。上代码。
public static double myPowerSquare(double base, int exponent) {
// 临界情况 -0的负数次方
if (base == 0 && exponent < 0) {
return 0;
}
// 临界情况-负数先取正值
int absExponent = exponent;
if (exponent < 0) {
absExponent = -exponent;
}
//递归过程中,指数为0,返回1
if(absExponent==0){
return 1;
}
//递归过程中,指数为1,返回base自己
if(absExponent==1){
return base;
}
//从上而下,不断递归,求平方
double ans = myPowerSquare(base, absExponent >> 1);
//自己乘自己,求平方
ans *= ans;
//判断是否是奇数,乘base自己
if((absExponent & 1)== 1){
ans *=base;
}
// 临界情况-结果集需要取倒数
if (exponent < 0) {
ans = 1 / ans;
}
return ans;
}