8 de set. de 2011

Arranjo, Combinação e Permutação

image

Essas três palavrinhas fazem parte de clássicos da computação e matemática. então resolvi explicá-las e demonstrar com a linguagem C.

Arranjo: são grupos sem repetição, ou seja, se eu tenho os elementos 1, 2 e 3, eu posso agrupá-los em dupla (conjuntos de dois elementos) para formar os seguintes números: 12, 13, 21, 23, 31, 32.

O arranjo é a base da Combinação e da permutação. Sua fórmula é descrita assim:

A n,p = n!/(n-p)!

image

Onde “n” é o quantidade de elementos e “p” o tamanho do grupo.

No exemplo mencionado temos 3 elementos (quantidade) colocados em par (tamanho do grupo = 2).

A 3,2 = 3!/(3-2)! = 3.2.1/1! = 6

Agora que já entendemos a base, vamos para o próximo, a Combinação.

Combinação: é um Arranjo onde deveremos ignoramos os grupos que contenha os mesmo elementos, independente da ordem.

No exemplo do Arranjo, nós consideramos conjuntos distintos os números 12 e 21, porque numericamente são diferentes.

Mas imagine o caso onde temos um João e uma Maria. Tanto faz se o conjunto é (João, Maria) ou (Maria, João), pois formam o mesmo casamento Smile. Então essa é a Combinação: Arranjos que desconsideramos demais conjuntos que contenham o mesmo elemento independente da ordem.

C n,p = A n,p/p! = n!/p!(n-p)!

image

Percebam que é possível compor a fórmula da Combinação se baseando na fórmula do Arranjo.

Vamos ver um exemplo: Qual a quantidade de duplas possíveis com as pessoas Adriana, Xenofreuda e Tonha.

C 3,2 = 3!/2!(3-2)! = 3.2.1/2.1.1! = 3

E finalmente a Permutação.

Permutação: Arranjos onde a quantidade de elementos é igual ao tamanho do grupo, utilizado muito em anagramas. Anagramas são as variações possíveis de se fazer com as letras de uma palavra, por exemplo a palavra “mel”: mle, lme, lem, eml, elm.

Sua formula é um simples fatorial:

P n = n!

image

Para o exemplo:

P 3 = 3! = 3.2.1 = 6

Uma vez que entendemos a teoria, vamos colocá-la na pratica dentro da computação com a linguagem C.

Para isso, usei conceitos de Recursividade e Números Fatoriais.

// -> Para poder usar o "wcout" e o cout
#include<iostream>
using namespace std;

long double CalcularFatorial(int numero)
{
    if(numero < 2)
        return numero;

    return numero * CalcularFatorial(numero - 1);
}

long double CalcularArranjo(int quantidadeElementos, int tamanhoGrupo)
{
    return CalcularFatorial(quantidadeElementos)/CalcularFatorial(quantidadeElementos - tamanhoGrupo);
}

long double CalcularCombinacao(int quantidadeElementos, int tamanhoGrupo)
{
    return CalcularArranjo(quantidadeElementos, tamanhoGrupo)/CalcularFatorial(tamanhoGrupo);
}

long double CalcularPermutacao(int quantidadeElementos)
{
    return CalcularFatorial(quantidadeElementos);
}

void main()
{
    setlocale(LC_ALL, "Portuguese"); // -> Permitir acentos.

    while(true)
    {
        // -> Limpa a tela.
        system("cls");

        // -> Monta o menu de opções.
        wcout << "Qual operação deseja realizar?" << endl;
        wcout << "\t1-) Fatorial" << endl;
        wcout << "\t2-) Arranjo" << endl;
        wcout << "\t3-) Combinação" << endl;
        wcout << "\t4-) Permutação" << endl;
        wcout << "\t5-) Sair" << endl;
        wcout << "\tOpção: ";

        int opcao, quantidadeElementos, tamanhoGrupo;
        long double resultado;

        scanf("%i", &opcao);

        switch (opcao)
        {
            case 1:
                wcout << "Infome um número para calcular seu fatorial: ";
                scanf("%i", &quantidadeElementos);

                resultado = CalcularFatorial(quantidadeElementos);
                break;
            case 2:
                wcout << "Cálculo de Arranjo" << endl;
                wcout << "Infome a quantidade de elementos: ";
                scanf("%i", &quantidadeElementos);
                wcout << "Infome o tamanho do grupo: ";
                scanf("%i", &tamanhoGrupo);

                resultado = CalcularArranjo(quantidadeElementos, tamanhoGrupo);
                break;
            case 3:
                wcout << "Cálculo de Combinação" << endl;
                wcout << "Infome a quantidade de elementos: ";
                scanf("%i", &quantidadeElementos);
                wcout << "Infome o tamanho do grupo: ";
                scanf("%i", &tamanhoGrupo);

                resultado = CalcularCombinacao(quantidadeElementos, tamanhoGrupo);
                break;
            case 4:
                wcout << "Cálculo de Permutação" << endl;
                wcout << "Infome a quantidade de elementos: ";
                scanf("%i", &quantidadeElementos);

                resultado = CalcularPermutacao(quantidadeElementos);
                break;
        }

        if(opcao > 4) // -> Encerra a aplicação
            break;

        wcout << endl << "Resultado: " << resultado << endl << endl;
        wcout << "Pressione enter para continuar...";
        fflush(stdin);
        getchar();
    }

    wcout << endl << "Fim!";
    /*fflush(stdin);
    getchar();*/
}

Percebam que, como vimos na teoria, é possível aproveitar o Arranjo para compor a formula da Combinação, e fiz exatamente isso na função CalcularCombinacao().

Outro ponto é que, para os resultados eu tive que apelar para o tipo long double (96 bits), pois quando falamos em fatoriais, os números podem crescer freneticamente.

Acompanhe alguns testes:

image

image

É isso daí pessoal.

Já calcularam qual o números de combinações possíveis de maquiagem de maquiagem da sua namorada, mulher ou enrolada?

Você irá se surpreender O.o

1 comentários:

Anônimo disse...

Cara esclareceu muito mesmo valew