algoritmo de exponenciação ordinária
Vamos olhar um exemplo DQR 2035
Um bonito ^ B
título Descrição
A ^ B inteiro procuram os três últimos dígitos da representação.
Descrição: A ^ B é o significado de "Um, poder B"
Entrada
Os dados de entrada que compreendem uma pluralidade de casos de teste, uma linha para cada exemplo, dois inteiros positivos A e B (1 <= A, B <= 10000), se A = 0, B = 0, isso significa que o fim dos dados de entrada sem processamento.
Resultado
Para cada teste, a saída de um final de três Uma representação de número inteiro ^ B, cada saída por linha.
amostra Iutput
2 3
12 6
6789 10000
0 0
Exemplo de saída
8
984
1
idéias de solução de problemas : as ideias mais simples devem estar falando sobre os dados obtidos e, em seguida, tomar o restante do 1000 obteve os últimos três dígitos, todos nós temos ouvido o conceito de explosão exponencial do mesmo, o resultado vai aumentar à medida que o índice de crescimento explosivo, e 6789 10000 poder mesmo muito longa tipo também é mantida elevada, abaixo de nós a introduzir um conjunto de fórmulas matemáticas
- (A + b)% C = ((a% c) + (b% C))% C
- a * b% C = ((a% c) * (b% C))% C
- a / b% C = (( um% C) / (b% C))% c
podemos módulo de operação para cada um dos factores, reduzindo assim o tamanho dos dados
a seguir o código em linguagem C
#include <stdio.h>
long long quit(long long x, long long y)
{
long long ans = 1;
for(int i = 1; i <= y; i++)
{
ans *= x;
ans = ans%1000;
}
return ans%1000;
}
int main(void)
{
long long a, b, ans;
while(~scanf("%lld%lld", &a, &b))
{
if(a == 0 && b == 0) break;
ans = quit(a, b);
printf("%d\n", ans);
}
return 0;
}
exponenciação ordinária complexidade de tempo algoritmo é O (n), o momento em que nós queremos encontrar os últimos três dígitos do 2 1 bilhões necessários será muito longo
Qual é o poder algoritmo rápido
ideia Speak índice de núcleo do algoritmo de força rápida diminui e aumenta em base irá reduzir o número de ciclos de
olharmos para uma castanha
2 ^ 2 = 9 . 8 * @ 2 base de caso-2
= 4 4 * na base de caso-2 // 4
= 16 2 * @ 2 base de caso-16
= 256 . 1 * @ 2 base de caso- 256
pode ser visto 2 . 9 resulta na base, quando o índice é igual a todo o produto estranho
Aqui usamos mostra o código!
long long fastPower(long long base, long long power)
{
long long ans = 1;
while(power > 0)
{
if(power % 2 == 0)//如果指数为偶数
{
power /= 2;//把指数缩小一半
base = base * base % 1000;//底数平方
}
else
{
power--;//指数减一
power /= 2;//把指数缩小一半
ans *= base % 1000;//指数为奇数时的积
base = base * base % 1000;//底数平方
}
}
return ans;
}
algoritmo de otimização de energia rápida
long long fastPower(long long base, long long power)
{
long long ans = 1;
while(power > 0)
{
if(power % 2 == 1)
{
ans *= base % 1000;
}
power /= 2;
base *= base % 1000;
}
return ans;
}
A otimização finais
Podemos alimentar% 2 == 1 & 1 ser substituído por um poder mais rápido, esta operação é chamada de "operação bit", poder & 1, em binário Se o último bit é 1, então o número for ímpar, se o último é 0, então o último é um número par, e neste momento 1 & cálculo, se um número ímpar, o resultado é 1, se o resultado for um número par 0 '
eo código é
long long fastPower(long long base, long long power)
{
long long ans = 1;
while(power > 0)
{
if(power&1)
{
ans *= base % 1000;
}
power /= 2;
base *= base % 1000;
}
return ans;
}
Este artigo Referência: https://blog.csdn.net/qq_19782019/article/details/85621386
(aprendizagem para uso pessoal)