剣はオファーの質問16を指します-値の整数乗

整数の累乗

タイトル:関数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;
}

———————————————————————————————————————————
参考書「ソードフィンガーオファー」》

おすすめ

転載: blog.csdn.net/rjszz1314/article/details/104161676
おすすめ