Cálculo de potencia rápido (calculadora simple)

entrar

Ingrese n en la primera línea, indicando que luego ingresará n grupos;

En las siguientes n líneas, hay tres respectivamente, a, b, s, que representan respectivamente los dos números a operar, y el símbolo de operación, como 1 2 +, que significa 1 + 2, 2 1000000000 ^, que significa 2 elevado a la potencia de 1000000000;

Debido a que el resultado puede ser muy grande, debe ser módulo 1000000007 y luego emitir;

Salida

Resultados del cálculo de salida, separados por líneas nuevas;

Código C ++

#include<iostream>
#define ll long long
using namespace std;
ll p = 1000000007;
ll quickpow(ll a, ll b) {
	ll ans = 1;
	while (b) { 
		if (b & 1) ans = ans * a % p;
		a = a * a % p, b = b >> 1;
	}return ans % p;
}

int main() {
	int i;
	cin >> i;
	while (i) {
		ll a, b;
		char s;
		cin >> a >> b >> s;
		if (s == '+') cout << (a % p + b % p) % p << endl;
		if (s == '-') cout << (a % p - b % p) % p << endl;
		if (s == '*') cout << ((a % p) * (b % p)) % p << endl;
		if (s == '^') cout << quickpow(a, b) << endl;
		i--;
	}return 0;
}


Lo importante aquí es la operación de exponenciación. Si es de acuerdo con el método convencional, la exponenciación es multiplicarse continuamente. La complejidad es O (n). A través de la exponenciación rápida, la complejidad se reduce a nivel logarítmico.

La clave aquí es la operación de desplazamiento del exponente b, b = b >> 1, que es mover el binario b un bit hacia la derecha. Por ejemplo, 2 es la undécima potencia, 11 es el 1011 binario y 2 es 11 La potencia es la potencia 1011 del binario de 2 y la potencia (8 + 2 + 1) de 2, donde 8, 2, 1 es el número de la posición binaria. Según el algoritmo del exponente de potencia, 2 ^ (11) = 2 ^ (8 + 2 + 1) = 2 ^ 8 * 2 ^ 2 * 2 ^ 1, hay un patrón entre los números multiplicados, y todos son cuadrados del dígito anterior, siempre que el número sea 1 en el dígito binario, aquí Es necesario multiplicar el número correspondiente. Cada vez que se multiplica, el binario b se mueve un bit a la derecha. Cuando b se mueve a la derecha a 0, sale y el producto termina. Este es el principio matemático de exponenciación rápida.

 

Supongo que te gusta

Origin blog.csdn.net/sinat_39416814/article/details/108700773
Recomendado
Clasificación