問題:指数整数倍精度浮動小数点型とベースint型所与。パワーベースの指数を求めて。
入力:double型の浮動小数点ベース、int型指数整数。
出力:double型の結果。
アイデア:この質問のアイデアは、そのハンドルに境界値、外れ値の多様性を忘れることは難しいが、簡単ではありません。
指数は、正、それらが指数1回、結果が得られたベース直接乗算である場合
1つの外れ値:指数はマイナスであります
処理方法は、第一の指数の絶対値を求め、その後、それらは、中間結果を得るための乗算を行い、最終的な結果は、1.0 /中間結果です。
2つの異常値:ベースが0の場合、指数は1/0になりやすい、負です。
処理方法:決意を高め、例外がスローされます。
コード:
class Solution {
public:
double Power_Core(double base, unsigned int exponent)
{
double result=base;
for(unsigned int i=1;i<exponent;++i)
{
result=result*base;
}
return result;
}
double Power(double base, int exponent) {
double result;
if(abs(base-0.0)<0.0000001&&exponent<0)
return 0.0;
if(exponent==0)
return 1.0;
unsigned int absExponent = (unsigned int)(exponent);
if(exponent<0)
absExponent = (unsigned int)(-exponent);
result= Power_Core(base, absExponent);
if(exponent<0)
{
result=1.0/result;
}
return result;
}
};
複雑分析:O(指数)の時間計算量は、空間的複雑度はO(1)です。
パフォーマンスの最適化:時間の複雑さを最適化することによりPower_Core機能がO(ログ指数)、そのまま空間的複雑に縮小されています。
double Power_Core(double base, unsigned int exponent)
{
if(exponent==1)
return base;
double result=Power_Core(base,exponent>>1);
result *= result;
if(exponent&0x1==1)
result*=base;
return result;
}