terça-feira, 6 de março de 2012

Desafio I - Fatorial

Fatorial
O fatorial de um número n é denotado por n! e corresponde ao produto de todos os naturais de 1 até n. Assumimos que 0! = 1. Utilizando essa definição, o fatorial pode ser  definido da seguinte maneira:
n! = 1*2*3*...*n

Desafio
Escrever um programa em C que lê um número inteiro n e calcula n!

Solução
A primeira dificuldade encontrada no problema é que a expressãon! = 1*2*3*...*n não é uma expressão simples que pode ser calculada diretamente. Primeiramente, vamos quebrar a expressão em pedaços menores mais simples que podem ser calculados diretamente e depois juntar os pedaços menores (Quase uma obra de arte). A propriedade associativa da multiplicação permite a decomposição do problema dessa maneira:
n! = ((((1*2)*3)*...*n-1)*n)
Utilizando essa decomposição, podemos calcular a expressão da seguinte maneira:
fat = 1
i = 2
fat = fat*i = 1*2 = 2!
i = i +1
fat = fat*i = fat*3 = (1*2)*3 = 3!
i = i +1
fat = fat*i = fat*4 = ((1*2)*3)*4 = 4!
i = i +1
...
fat = fat*i = fat*n = (((1*2)*3)*...*n-1)*n = n!


Observe que no passo i, estamos calculando o i!. Podemos traduzir essa idéia para um programa em C da seguinte maneira:

#include <stdio.h>
int main(){
  int i;
  int n,fat;
  scanf("%d",&n);
  fat=1;
  i=2;
  while(i<=n){
    fat = fat*i;
    i = i+1;
  }
  printf("%d\n",fat);
}

Exercício: Refaça o algoritmo considerando a seguinte decomposição 
n! = (1*(2*..(n-3*(n-2*(n-1*n)))))

Nenhum comentário: