Oferta de Jianzhi (C++) -JZ16: potencia de valor entero (operación de algoritmo-bit)

Autor: Zhai Tianbao Steven
Declaración de derechos de autor: Los derechos de autor pertenecen al autor. Para reimpresión comercial, comuníquese con el autor para obtener autorización. Para reimpresión no comercial, indique la fuente

Descripción del Título:

Implemente la función potencia doble (base doble, exponente int) para encontrar la potencia exponente de la base.

Aviso:

1. Asegúrese de que la base y el exponente no sean 0 al mismo tiempo.

2. No utilice funciones de biblioteca y no necesite considerar el problema de los grandes números.

3. Hay preguntas de juicio especiales, no considere los dígitos de 0 después del punto decimal.

Rango de datos: ∣base∣≤100, ∣exponent∣≤100, asegúrese de que el resultado final debe satisfacer ∣val∣≤104 
avanzado: complejidad espacial O (1), complejidad temporal O (n) 

Ejemplo:

ingresar:

2.00000,-2

valor de retorno:

0,25000

ilustrar:

2 elevado a -2 es igual a 1/4=0,25

Ideas para resolver problemas:

Esta pregunta examina las operaciones de bits. Tres formas de resolver problemas.

1) Ley de Violencia

       El ciclo se puede multiplicar. Complejidad O(n).

2) Operaciones de bits: exponenciación rápida

       Se puede lograr una exponenciación rápida realizando operaciones de bits en números de potencia. La complejidad es O (logn).

       Por ejemplo, la potencia 13 es 1101, que son 1, 4 y 8 respectivamente, es decir, la potencia 13 de la base es igual a la potencia 1 de la base * la potencia 4 de la base * la potencia 8 de la base. Tomando esto como ejemplo, el siguiente texto describe el proceso para una fácil comprensión.

       a) Después de ingresar al bucle por primera vez, la potencia actual es 1101, &1 puede volverse verdadera, el resultado se multiplica por base, luego base*=base, la base se convierte en la potencia de 2 y la operación de bits se desplaza hacia la derecha. para obtener 0110.

       b) En el segundo ciclo, &1 se vuelve falso, es decir, el bit bajo actual es 0, no es necesario multiplicar el resultado por la base, y la base se multiplica continuamente, la base se convierte en la cuarta potencia y la operación del bit se desplaza hacia la derecha para obtener 0011.

       c) En el tercer ciclo, &1 se vuelve verdadero y el resultado se multiplica por la base. En este momento, la base es la cuarta potencia y el resultado se convierte en la quinta potencia de la base, y luego se multiplica la base y la base se convierte en la octava potencia y la operación de bit se desplaza hacia la derecha. Obtuvo 0001.

       d) En el cuarto ciclo, &1 se vuelve verdadero, multiplica el resultado por base, la base es la octava potencia, el resultado se convierte en la decimotercera potencia de la base, luego multiplica la base, la base se convierte en la decimosexta potencia y la operación de bits se desplaza a la derecho a obtener 0000 .

       e) Salir del ciclo y devolver el resultado.

Código de prueba:

1) Ley de Violencia

class Solution {
public:
    double Power(double base, int exponent) {
        // 负数次方
        if(exponent < 0){
            base = 1 / base;
            exponent = -exponent;
        }
        // 累乘
        double result = 1;
        for(int i = 0; i < exponent; ++i){
            result *= base;
        }
        return result;
    }
};

2) Operaciones de bits: exponenciación rápida

class Solution {
public:
    double Power(double base, int exponent) {
        // 负数次方
        if(exponent < 0){
            base = 1 / base;
            exponent = -exponent;
        }
        // 位运算实现快速幂
        double result = 1;
        while(exponent){
            if(exponent & 1){
                result *= base;
            }
            base *= base;
            exponent = exponent >> 1;
        }
        return result;
    }
};

Supongo que te gusta

Origin blog.csdn.net/zhaitianbao/article/details/132165179
Recomendado
Clasificación