es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 en f[0] * 2 + 0, que evalúa a 2 ya que f[0] se establece inicialmente en 1. El valor de transmission es 0, por lo que f[0] se establece en pom % 10, que es 2 % 10 = 2. transmission se establece en pom / 10, que es 2 / 10 = 0.

    En la siguiente iteración del bucle interior (j = 1), pom se establece en f[1] * 2 + 0, pero como f[1] no ha sido inicializado, es 0. Por lo tanto, pom también es 0. f[1] se establece en pom % 10, que es 0. transmission se establece en pom / 10, que es 0.

    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 de f 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 que transmission siempre es 0.

    ¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.

Comments are closed.