题目

  • 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路

  • 浮点底数base情况

    • 大于0:直接使用
    • 等于0:特殊考虑
    • 小于0:直接使用
  • 整形指数e的情况

    • 大于0:直接使用
    • 等于0:正常使用
    • 小于0:先对指数求绝对值,然后算出次方结果后再取倒数
  • 综上所述,本题目需要单独考虑的因素为:底数为0并且指数小于0 的情况。如果不进行考虑就会出现对0求倒数的情况

  • 还有一种情况是0的0次方,结果为0或者1,根据面试官的要求确定

  • 对于出现0的负数次方的情况,常用的表示方法为:返回值、全局变量、异常

  • 使用布尔型全局变量表示错误的情况

public class Solution {
    boolean flag = false;
    public double Power(double base, int exponent) {
        if(base==0.0 && exponent<0){
            flag=true;
            return 0.0;
        }
        int absExponent =exponent;
        if(exponent<0){
            absExponent=-exponent;
        }
        double result = PowerWithUnsignedExponent(base,absExponent);
        if(exponent<0){
            result = 1.0/result;
            return result;
        }
        return result;
    }
     public double PowerWithUnsignedExponent(double base, int exponent){
            double result=1.0;
            for(int i=1;i<=exponent;i++){
                result*=base;
            }
            return result;
        }
}
  • 以上代码能够正确的解题目,但不完美。
  • 可以再继续优化:
    • PowerWithUnsignedExponent函数需要完成exponent-1 次的乘数运算,可以通弄过程序优化更进一步
public class Solution {
    boolean flag = false;
    public double Power(double base, int exponent) {
        if(base==0.0 && exponent<0){
            flag=true;
            return 0.0;
        }
        int absExponent =exponent;
        if(exponent<0){
            absExponent=-exponent;
        }
        double result = PowerWithUnsignedExponent(base,absExponent);
        if(exponent<0){
            result = 1.0/result;
            return result;
        }
        return result;
    }
      public double PowerWithUnsignedExponent(double base, int exponent){
            //double result=1.0;
            if(exponent==0)
                 return 1.0;
            if(exponent==1)
                return base;
            double result = PowerWithUnsignedExponent(base,exponent >> 1);
            result*=result;
            if((exponent&0x01)==1){
                result*=base;
            }
            return result;
        }
}