Solución a la Tarea 3: Factorizando Factoriales

A continuación muestro un programa que resuelve el problema propuesto. Observe que todo el trabajo se hace en las funciones primo (que regresa cero en cuanto encuentra un divisor de p) y factor (que calcula la suma n/p + n/p2 + n/p3 + ...). Lo único que hace la función main es llamar a factor si ya ha determinado que un número es primo. Observe también que el programa no calcula el valor de n! pues no cabría en una variable entera incluso para valores muy pequeños de n (9! = 362,880 > 65,536 = 216, 13! = 6,227,020,800 > 4,294,967,296 = 232 y 21! = 51,090,942,171,709,440,000 > 18,446,744,073,709,551,616 = 264).

#include <stdio.h>

int primo(long int p)
{
  long int i;
 
  for (i = 2; i*i <= p; i++)
    if (p%i == 0)
      return 0;
  return 1;
}

long int factor(long int n, long int p)
{
  long int f = 0;

  do {
    n = n/p;
    f += n;
  } while (n >= p);
  return f;
}

int main(void)
{
  long int n, p;

  scanf("%ld", &n);
  for (p = 2; p <= n; p++)
    if (primo(p))
      printf("%ld^%ld ", p, factor(n, p));
  printf("\n");
  return 1;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

Entrada  Salida
      2  2^1
      3  2^1 3^1
      4  2^3 3^1
      5  2^3 3^1 5^1
      6  2^4 3^2 5^1
     10  2^8 3^4 5^2 7^1
     11  2^8 3^4 5^2 7^1 11^1
     12  2^10 3^5 5^2 7^1 11^1
     13 
2^10 3^5 5^2 7^1 11^1 13^1
     14 
2^11 3^5 5^2 7^2 11^1 13^1
     15  2^11 3^6 5^3 7^2 11^1 13^1
     20  2^18 3^8 5^4 7^2 11^1 13^1 17^1 19^1
     30  2^26 3^14 5^7 7^4 11^2 13^2 17^1 19^1 23^1 29^1
     40  2^38 3^18 5^9 7^5 11^3 13^3 17^2 19^2 23^1 29^1 31^1 37^1
     50  2^47 3^22 5^12 7^8 11^4 13^3 17^2 19^2 23^2 29^1 31^1 37^1 41^1 43^1 47^1