Límite de tiempo del progtwig de CA al calcular el factorial de números en c

Estoy resolviendo un problema en el cálculo de factorial y el desafío es el siguiente!

You are asked to calculate factorials of some small positive integers. Input An integer t, 1<=t<=100, denoting the number of testcases, followed by t lines, each containing a single integer n, 1<=n<=100. Output For each integer n given at input, display a line with the value of n! 

Mi código me está dando la solución correcta pero se excede el límite de tiempo, que es de 2 segundos:

El código es el siguiente:

 #include #include #include void factorial(int N) { printf("\n\n"); int q,i,j,t,d,z; float p=0.0; for(i=2;i<=N;i++) p=p+log10(i); d=(int)p+1;//No of terms in the factorial int *b; //initialization of an array b=(int *)malloc(d*sizeof(int)); b[0]=1; for(i=1;i<N;i++) b[i]=0; //calculation of factorial p=0.0; for(j=2;j<=N;j++) { q=0; p=p+log10(j); z=(int)p+1; for(i=0;i=0;i--) printf("%d",b[i]); } int main() { int n,i,j; scanf("%d",&n); int *b; b=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) { scanf("%d",&b[i]); } for(i=0;i<n;i++) factorial(b[i]); return 0; } 

¿Cómo puedo hacer que mi progtwig sea más eficiente y producir el resultado en el límite de tiempo dado? Este reto es de HackerEarth.

Dado que N es pequeño, un algoritmo eficiente sería calcular previamente todos los factoriales:

 BigNumberType fact[101]; // The numbers will become big, so you need (to create) a type to store it fact[0] = 1.0; for (i=0; i < 100; i++) { fact[i+1] = multiply(fact[i], i); } 

Después de eso, buscar el valor es trivial.

Nota:

Puede ser incluso más eficiente escanear el vector de entrada para el número más alto y calcular solo los factoriales hasta ese número.