Cálculo del factorial utilizando un array.
Tengo un programa que calcula el factorial de un número (incluso superior a 20), pero ve el número como una serie de dígitos. De esta manera:
Aquí está el código:
#include <stdio.h>
#include <stdlib.h>
#define MAXCIF 1000
int main()
{
int f[MAXCIF] = { 1 };
int i, j, n, pom, transmission;
do
{
printf("n="); scanf("%d", &n);
} while (n < 1 || n > 100);
for (i = 2; i <= n; i++)
{
for (j = 0,transmission=0; j < MAXCIF; j++)
{
pom = f[j] * i + transmission;
f[j] = pom % 10;
transmission = pom / 10;
}
}
printf("%d != ", n);
for (j = MAXCIF - 1; f[j] == 0; j--); // Se omitirán los ceros iniciales
for (; j >= 0; j--)
printf("%d", f[j]); // Imprime los dígitos
return 0;
}
Lo que me causa un problema es que no entiendo cómo funcionan estos dos bucles:
for (i = 2; i <= n; i++)
{
for (j = 0,transmission=0; j < MAXCIF; j++)
{
pom = f[j] * i + transmission;
f[j] = pom % 10;
transmission = pom / 10;
}
}
Por ejemplo, tomemos n = 2:
Según entiendo estos bucles, pom = 2
, f[0] = 2
, transmission = 0
.
En la siguiente iteración, j = 1
, entonces ¿cómo queda f[1] = 0
?
Si alguien pudiera explicar estos dos bucles for, es decir, cómo entender manualmente lo que está sucediendo en ellos, estaría agradecido.
davy.ai
El bucle exterior (
for (i = 2; i <= n; i++)
) itera desde 2 hasta n, calculando el factorial de n. El bucle interior (for (j = 0, transmission = 0; j < MAXCIF; j++)
) itera a través de cada dígito del factorial.Por ejemplo, consideremos el caso de n = 2:
En la primera iteración del bucle exterior (i = 2), el bucle interior comienza con j = 0. En este punto,
pom
se establece enf[0] * 2 + 0
, que evalúa a2
ya quef[0]
se establece inicialmente en 1. El valor detransmission
es 0, por lo quef[0]
se establece enpom % 10
, que es2 % 10 = 2
.transmission
se establece enpom / 10
, que es2 / 10 = 0
.En la siguiente iteración del bucle interior (j = 1),
pom
se establece enf[1] * 2 + 0
, pero comof[1]
no ha sido inicializado, es 0. Por lo tanto,pom
también es 0.f[1]
se establece enpom % 10
, que es0
.transmission
se establece enpom / 10
, que es0
.El bucle interior continúa iterando a través de los dígitos restantes de
f
, pero como no han sido inicializados, todos serán 0. El valor final def
será {2, 0, 0, …, 0} ya que solo se actualizó el primer dígito.Ten en cuenta que
transmission
se utiliza para llevar cualquier dígito restante (es decir, llevar el 1 en 12) al siguiente dígito. En este caso, no hay dígitos restantes, por lo quetransmission
siempre es 0.¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.