[Pregunta] La espada P110 se refiere a la oferta: Operación de bits: Pregunta de entrevista 16: La potencia entera del valor

Pregunta de la entrevista 16: El poder entero del valor

Tema:
Implemente la función double Power (doble base, int exponente) y encuentre la potencia del exponente de la base. No utilice las funciones de la biblioteca y no es necesario que considere la cuestión de los números grandes.

Código completo pero no eficiente

// 全局变量:判断返回值是否为异常值
// 比如返回值0.0
// ( base==0.0 && exponent<0 )属于异常情况
bool g_InvalidInput = false;

// 判断两个浮点数是否相等,不能使用"=="
bool equal(double num1, double num2);
// 求base的exponent次方
double PowerWithUnsignedExponent(double base, unsigned int exponent);

double Power(double base, int exponent)
{
    
    
    g_InvalidInput = false;
    // 异常情况
    if (equal(base, 0.0) && exponent < 0)
    {
    
    
        g_InvalidInput = true;
        return 0.0;
    }
    // 得到exponent的绝对值
    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)
{
    
    
    // exponent==0
    // 程序不进入循环,直接返回1.0
    double result = 1.0;

    for (int i = 1; i <= exponent; ++i)
        result *= base;
    return result;
}


bool equal(double num1, double num2)
{
    
    
    if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
        return true;
    else
        return false;
}


double Test1()
{
    
    
    return Power(2, 3);
}


int main(int argc, char* argv[])
{
    
    
    double a = Test1();
    cout << a << endl;

    return 0;
}

Código completo y eficiente

Si el exponente del exponente de entrada es 32, se requieren 31 multiplicaciones en el ciclo de la función PowerWithUnsignedExponent. Pero podemos pensar en ello de otra manera:
nuestro objetivo es encontrar la potencia 32 de un número. Si ya conocemos su potencia 16, simplemente cuadre una vez más sobre la base de la potencia 16. La 16ª potencia es el cuadrado de la 8ª potencia.
De esta manera, solo necesitamos hacer 5 multiplicaciones para encontrar la potencia 32:
primero encuentra el cuadrado, encuentra la cuarta potencia sobre la base del cuadrado, encuentra la octava potencia sobre la base de la cuarta potencia y encuentra la octava potencia sobre la base de la potencia 8. Encuentra la potencia 16 y finalmente encuentra la potencia 32 sobre la base de la potencia 16.

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);

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;
    // 考虑exponent是否是奇数,如果是奇数,在除法运算中会损失一次操作
    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;
}


double Test1()
{
    
    
    return Power(2, 3);
}


int main(int argc, char* argv[])
{
    
    
    double a = Test1();
    cout << a << endl;

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46613023/article/details/114932279
Recomendado
Clasificación