[Algoritmo] - Rápido e otimização de energia algoritmo

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

  1. (A + b)% C = ((a% c) + (b% C))% C
  2. a * b% C = ((a% c) * (b% C))% C
  3. 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)

Publicado 20 artigos originais · ganhou elogios 2 · Visualizações 945

Acho que você gosta

Origin blog.csdn.net/zhbbbbbb/article/details/103429600
Recomendado
Clasificación