Solução Fatorial

Solução de Pedro Michael, comentários de Rogério Júnior

 

Para ver o problema original, clique aqui.

Este problema se torna muito fácil pelo seguinte motivo: Seja x_i o valor que queremos alcançar somando fatoriais, então podemos usar uma estratégia gulosa colocar o maior fatorial que não supera x, pois ele é múltiplo de todos os fatoriais menores (definição de fatorial).

Deste modo, basta sempre usarmos o maior fatorial que pudermos, e teremos nossa resposta ótima. Segue o código para melhor entendimento.


#include <stdio.h>
int main()
{
int fat[10], n, j, cont = 0;
fat[0] = 1;
// calculo todos os fatoriais necessários
for(int i = 1; i <= 9; i++)
fat[i] = i*fat[i-1];
// leio o valor de n
scanf("%d", &n);
//enquanto n!=0
while(n)
{
// procuro o maior fatorial que cabe em n
j = 1;
while(n >= fat[j])
j++;
// subtraio o seu valor de n
n-=fat[j-1];
// e o adiciono na contagemd a resposta
cont++;
}
// por fim, basta imprimir o valor de cont
printf("%d\n", cont);
return 0;
}

view raw

fatorial.cpp

hosted with ❤ by GitHub