Sword se refiere a la pregunta 16 de la oferta: el poder entero del valor

Poder entero

Título: Implementa la función double Power (doble base, int exponente),
encuentra la base a la potencia del exponente. No utilice las funciones de la biblioteca y no tenga en cuenta grandes cantidades

Debido a que no hay necesidad de considerar números grandes, parece ser muy simple, solo sume.

double Power(double base,int exponent)
{
    
    
	double result=1.0;
	for(int i=0;i<=exponent;++i)
		result*=result;
	return result;
}

Pero hay un problema serio, ¿qué debo hacer si el exponente de entrada es menor que 1 (0 y negativo)? Obviamente, el código anterior no considera

Después de considerarlo, el código es el siguiente:

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;
}

Aunque hay una respuesta correcta, encontrará que dicha eficiencia es demasiado baja ¿Existe alguna forma sencilla?
¡Por supuesto que la hay!

Imagínese esto: si nuestro objetivo es encontrar un número elevado a la 32ª potencia, si conocemos su 16ª potencia, eleve al cuadrado la 16ª potencia. 16 se puede elevar al octavo poder ...

En otras palabras, podemos usar la siguiente fórmula para encontrar la n-ésima potencia de a:
Inserte la descripción de la imagen aquí
Esta fórmula se implementa fácilmente por recursividad. El nuevo código PowerWithUnsignedExponent es el siguiente:

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;
}

Para que pueda obtener un código eficiente

El código completo es el siguiente:

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;
}

——————————————————————————————————————————
Libro de referencia "Oferta de dedo de espada》

Supongo que te gusta

Origin blog.csdn.net/rjszz1314/article/details/104161676
Recomendado
Clasificación