剣指Offer第2面試験問題16(java実現)


タイトルの説明
doubleタイプの浮動小数点数baseとintタイプの整数exponentを指定します.baseのexponent次数を求めます.
問題を解く構想.
  • 指数が負の場合は、まず指数に対して絶対値を求める、次数の結果を算出してから逆数
  • をとることができる.
  • 底数が0、指数が負の場合、0に対して逆数を求める場合があり、
  • を特殊に処理する.
  • 0の0次方程式は数学的に意味がないため、出力0にしても1にしても許容できる
  • である.
  • 次方程式を計算するとき、簡単な遍歴を除いて、私たちは再帰的な思想を使って、以下の公式を使って、計算量を減らすことができます:
  • コード実装
    public class Problem16a {
        public double Power(double base, int exponent) {
            int n = exponent;
            if(exponent==0){
                return 1;
            }else if(exponent < 0){
                if(base == 0){
                    throw new RuntimeException("     0");
                }
                n = -exponent;
            }
            double res = PowerUnsignedExponent(base, n);
            return exponent<0? 1/res: res;
        }
        public double PowerUnsignedExponent(double base, int n){
            if(n == 0)
                return 1;
            if(n == 1)
                return base;
            double res = PowerUnsignedExponent(base, n/2);
            res *= res;
            if(n%2 == 1)
                res *= base;
            return res;
        }
    }

    コードの概要
    この問題は公式を利用すると少し速くなる.