LeetCode 解答 #50. Pow(x, n) プログラミング練習
問題:
難易度: 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を返し、
そうでない場合は普通に掛け算で累乗を真似ます。
コーナーケースが多いだけで注意すれば難しい問題ではありません。
今日は以上。
よいプログラミング生活を!