题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不要考虑大数问题。
本题要求和c语言的库中一个pow函数相同的功能。
1.全面但不高效的解法
package BitCount;
public class PowerMain {
boolean g_invalidInput = false;
public double Power(double base, int exponent) {
g_invalidInput = false;
if (equal(base, 0.0) && exponent < 0) {
g_invalidInput = true;
return 0.0;
}
int absExponent = exponent;
if (exponent < 0) // 考虑到为幂为负数时
absExponent = -exponent;
double result = PowerWithUnsignedException(base, absExponent);
if (exponent < 0)
result = 1.0 / result;
return result;
}
public boolean equal(double num1, double num2) {
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
public double PowerWithUnsignedException(double base, int absExponent) {
double result = 1.0;
for (int i = 1; i <= absExponent; i++) {
result *= base;
}
return result;
}
public static void main(String[] args) {
PowerMain powerMain = new PowerMain();
System.out.println(powerMain.Power(0.0, -1) + " g_invalidinput="
+ powerMain.g_invalidInput);
System.out.println(powerMain.Power(3.0, -1) + " g_invalidinput="
+ powerMain.g_invalidInput);
System.out.println(powerMain.Power(3.0, 2) + " g_invalidinput="
+ powerMain.g_invalidInput);
}
}
运行的结果为:
0.0 g_invalidinput=true
0.3333333333333333 g_invalidinput=false
9.0 g_invalidinput=false
2.全面而又高效的解法,确保我们拿到offer
将上面的函数
public double PowerWithUnsignedException(double base, int absExponent)
改成递归加位移来算,这样算法的效率变高了,注意细节,细节很重要。
public double PowerWithUnsignedException2(double base, int exponent) {
if (exponent == 0)
return 1.0;
if (exponent == 1)
return base;
double result = PowerWithUnsignedException2(base, exponent >> 1);
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
在本题中很容易忽略底数为0而指数为负数的情况。