Dado que es necesario factorizar muchos números que no superan 10^7, resulta conveniente realizar un precálculo. Mediante una versión modificada de la criba de Eratóstenes construimos un arreglo (smallest prime factor), donde
contiene el menor divisor primo del número
La factorización del número se realiza de la siguiente manera. Mientras n > 1, tomamos p = spf[n], el menor divisor primo del valor actual de , y dividimos entre mientras la división sea exacta, contando el exponente. Luego mostramos el factor elevado a la potencia correspondiente y pasamos al siguiente divisor primo. De este modo, los factores primos se obtienen en orden creciente, lo cual corresponde al formato de salida requerido.
La construcción de la criba requiere O(n~log~log~n) de tiempo. Cada división reduce al menos a la mitad, por lo que la factorización de un número se realiza en O(log~n). La complejidad temporal total para consultas es O(n~log~log~n + q~log~n).
Implementación del algoritmo
Declaremos un arreglo , en el que contiene el menor divisor primo del número .
#define MAX 10000001
int spf[MAX + 1];La función Sieve implementa la criba de Eratóstenes y llena el arreglo .
void Sieve(int n)
{
for (int i = 0; i < n; i++)
spf[i] = i;
for (int i = 2; i <= sqrt(n); i++)
if (spf[i] == i)
for (int j = i * i; j < n; j += i)
if (spf[j] == j) spf[j] = i;
}La función factorize descompone el número en factores primos, utilizando el arreglo .
void factorize(int n)
{Extraemos los factores primos del número mientras este sea mayor que .
while (n > 1)
{El menor divisor primo del número es igual a .
int p = spf[n];Encontramos la potencia máxima para la cual p^{power} divide al número .
int power = 0;
while (n % p == 0)
{
n /= p;
power++;
}Mostramos el factor p^{power}.
if (power > 1) printf("%d^%d", p, power); else printf("%d", p);Entre los factores se debe mostrar el signo ''.
if (n > 1) printf("*");
}
printf("\n");
}Parte principal del programa. Llenamos el arreglo utilizando la criba de Eratóstenes.
Sieve(MAX);Para cada valor de entrada , mostramos su descomposición en factores primos.
while (scanf("%d", &n) == 1)
factorize(n);