LeetCode 解答 #50. Pow(x, n) プログラミング練習

問題:
f:id:stlisacity:20180726223830p:plain
難易度: medium
入力:  double , int
目的: 既存の関数なしで累乗の計算を実現せよ
出力: double

入力はintではなくdoubleだ。
つまり小数点の部分も考えなければならない。
累乗計算は-2乗等も含むのできちんと分類しておこう。
注意すべき事: 

  • 入力が0や、累乗される数字が1や₋1の場合等、特殊ケースが多いので注意しよう。

以下回答です。

class Solution {
    public double myPow(double x, int n) {
        if (n == 0) return 1;
        double y = x;
        int sign = 1;
        if (x == 1) return 1;
        if (x == -1) {
            if (n%2 == 0) return 1;
            else return -1;
        }
        if (n<0) {
            if ( n == Double.MIN_VALUE ) {
                x = x*x;
                n++;
            }
            sign = 0;
            n = -n;
        }        
        for (int i=0; i<n-1; i++) {
            x *= y;
            if (x > Double.MAX_VALUE) {
                if (sign == 1)
                    return Double.MAX_VALUE;
                else return 0;
            }
            if (x == 0) return 0;
         }
        if (sign == 0) x = 1/x;
        return x;
    }
}

まずは累乗で最も特殊な三つのケース、xが+-1, nが0のケースを処理します。
続いてnがマイナスの場合。
nが万一DoubleのMIN_VALUEの時、そのまま正数に変えてしまうとオーバーフローが起きてしまうのでxを二乗させ、nをMIN_VALUE+1にします。
nがMIn_valueでないマイナス数字の場合は-を+にし、最後に処理します。
その他、もし結果がdoubleより大きい場合はMax_valueを返し、
そうでない場合は普通に掛け算で累乗を真似ます。
コーナーケースが多いだけで注意すれば難しい問題ではありません。

今日は以上。
よいプログラミング生活を!