整数の累乗
タイトル:関数double Power(double base、int exponent)を実装
し、指数乗の底を見つけます。ライブラリ関数を使用せず、多数を考慮する必要はありません
大きな数を考慮する必要がないので、非常に単純なようです。合計するだけです。
double Power(double base,int exponent)
{
double result=1.0;
for(int i=0;i<=exponent;++i)
result*=result;
return result;
}
しかし、深刻な問題があります。入力指数が1未満(0で負)の場合はどうすればよいですか?明らかに、上記のコードは考慮していません
検討後のコードは次のとおりです。
bool g_InvalidInput=false;
double Power(double base,int exponent)
{
g_InvalidInput=false;
if(equal(base,0.0) && exponent<0)
{
g_InvalidInput=true;
return 0.0;
}
unsigned int absExponent=(unsigned int)(exponent);
if(exponent<0)
absExponent=(unsigned int)(-exponent);
double result=PowerWithUnsignedExponent(base,absExponent)
if(exponent<0)
result=1.0/result;
return result;
}
double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
double result=1.0;
for(int i=1;i<=exponent;++i)
result*=base;
return result;
}
正解はありますが、効率が低すぎることがわかりますが、簡単な方法はありますか?
もちろんあります!
これを想像してみてください。私たちの目標が32乗の数を見つけることである場合、その16乗がわかっている場合は、16乗で2乗します。16は8乗することができます...
つまり、次の式を使用して、aのn乗を見つけることができます。
この式は、再帰によって簡単に実装できます。新しいPowerWithUnsignedExponentコードは次のとおりです。
PowerWithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=PowerWithUnsignedExponent(base,expnent>>1);
result*=result;
if(exponent & 0x1==1)
return*=base;
return result;
}
だからあなたは効率的なコードを得ることができます
完全なコードは次のとおりです。
double Power(double base, int exponent)
{
g_InvalidInput = false;
if (equal(base, 0.0) && exponent < 0)
{
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int) (exponent);
if (exponent < 0)
absExponent = (unsigned int) (-exponent);
double result = PowerWithUnsignedExponent(base, absExponent);
if (exponent < 0)
result = 1.0 / result;
return result;
}
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
bool equal(double num1, double num2)
{
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
———————————————————————————————————————————
参考書「ソードフィンガーオファー」》