方法1,自以为题目简单的算法
代码:
public class Offer11_1 {
public double Power(double base, int exponent){
double result = 1.0;
for(int i =1;i<=exponent;i++){
result *= base;
}
return result;
}
public static void main(String[] args) {
Offer11_1 of111 = new Offer11_1();
//测试用例
System.out.println("底数为2,指数为2的运行结果:"+ of111.Power(2, 2));
System.out.println("底数为2,指数为-2的运行结果:"+ of111.Power(2, -2));//没考虑这种情况
System.out.println("底数为2,指数为0的运行结果:"+ of111.Power(2, 0));//没考虑这种情况
System.out.println("底数为2,指数为1的运行结果:"+ of111.Power(2, 1));
System.out.println("底数为-2,指数为2的运行结果:"+ of111.Power(-2, 2));
System.out.println("底数为-2,指数为-2的运行结果:"+ of111.Power(-2, -2));//没考虑这种情况
System.out.println("底数为-2,指数为0的运行结果:"+ of111.Power(-2, 0));
System.out.println("底数为0,指数为2的运行结果:"+ of111.Power(0, 2));
System.out.println("底数为0,指数为-2的运行结果:"+ of111.Power(0, -2));//运行结果错误
System.out.println("底数为0,指数为0的运行结果:"+ of111.Power(0, 0));//运行结果错误
}
}
运行结果:
方法2,全面但不够有效的算法
代码:
public class Offer11_2 {
public double Power(double base, int exponent){
if(equal(base, 0.0) && exponent < 0)
throw new RuntimeException("while exponent is minus, the base can't be zero");
int absExponent = exponent;
if(exponent < 0)
absExponent = ~exponent +1;//整数按位取反+1得到它的相反数,-2与+2互为相反数
double result = powerWithUnsignedExponent(base, absExponent);
if(exponent<0)
result = 1.0/result;
return result;
}
public boolean equal(double number1, double number2){
if(number1 - number2 > -0.0000001 && (number1-number2) < 0.0000001)
return true;
return false;
}
public double powerWithUnsignedExponent(double base, double exponent){
double result = 1.0;
for(int i =1;i<=exponent;i++){
result *= base;
}
return result;
}
public static void main(String[] args) {
Offer11_2 of112 = new Offer11_2();
//测试用例
System.out.println("底数为2,指数为2的运行结果:"+ of112.Power(2.0, 2));
System.out.println("底数为2,指数为-2的运行结果:"+ of112.Power(2, -2));
System.out.println("底数为2,指数为0的运行结果:"+ of112.Power(2, 0));
System.out.println("底数为2,指数为1的运行结果:"+ of112.Power(2, 1));
System.out.println("底数为-2,指数为2的运行结果:"+ of112.Power(-2, 2));
System.out.println("底数为-2,指数为-2的运行结果:"+ of112.Power(-2, -2));
System.out.println("底数为-2,指数为0的运行结果:"+ of112.Power(-2, 0));
System.out.println("底数为0,指数为2的运行结果:"+ of112.Power(0, 2));
System.out.println("底数为0,指数为-2的运行结果:"+ of112.Power(0, -2));
System.out.println("底数为0,指数为0的运行结果:"+ of112.Power(0, 0));
}
}
运行结果:
方法3,全面又高效的算法
代码:
public class Offer11_3 {
public double Power(double base, int exponent){
if(equal(base, 0.0) && exponent < 0)
throw new RuntimeException("while exponent is minus, the base can't be zero");
int absExponent = exponent;
if(exponent < 0)
absExponent = ~exponent +1;//整数按位取反+1得到它的相反数,-2与+2互为相反数
double result = powerWithUnsignedExponent(base, absExponent);
if(exponent<0)
result = 1.0/result;
return result;
}
public boolean equal(double number1, double number2){
if(number1 - number2 > -0.0000001 && (number1-number2) < 0.0000001)
return true;
return false;
}
public double powerWithUnsignedExponent(double base, int exponent){//开始时我把int exponent
if(exponent ==0) //不小心写成double类型,结果exponent >> 1和exponent & 0x1报错:符号>>和&未定义
return 1;
if(exponent == 1)
return base;
double result = powerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if((exponent & 0x1) == 1)
result *= base;
return result;
}
public static void main(String[] args) {
Offer11_3 of113 = new Offer11_3();
//测试用例
System.out.println("底数为2,指数为2的运行结果:"+ of113.Power(2.0, 2));
System.out.println("底数为2,指数为-2的运行结果:"+ of113.Power(2, -2));
System.out.println("底数为2,指数为0的运行结果:"+ of113.Power(2, 0));
System.out.println("底数为2,指数为1的运行结果:"+ of113.Power(2, 1));
System.out.println("底数为-2,指数为2的运行结果:"+ of113.Power(-2, 2));
System.out.println("底数为-2,指数为-2的运行结果:"+ of113.Power(-2, -2));
System.out.println("底数为-2,指数为0的运行结果:"+ of113.Power(-2, 0));
System.out.println("底数为0,指数为2的运行结果:"+ of113.Power(0, 2));
System.out.println("底数为0,指数为-2的运行结果:"+ of113.Power(0, -2));
System.out.println("底数为0,指数为0的运行结果:"+ of113.Power(0, 0));
}
}
运行结果: