Solución reto factorízame

Solo hubo un participante y tuvo la misma solución que tenía yo:

private static ArrayList ObtenerMultiplos(ulong Numero)

{

    ArrayList al = new ArrayList();

    int aumentar = 4;

    if (Numero == 1)

        return null;

    if (Numero == 2 || Numero == 3)

    {

        al.Add(Numero);

        return al;

    }

    while (Numero % 2 == 0)

    {

        al.Add(2);

        Numero /= 2;

    }

    while (Numero % 3 == 0)

    {

        al.Add(3);

        Numero /= 3;

    }

    ulong factorial = 24;

    ulong i = 5;

    while ((i <= Math.Sqrt(Numero) + 1) && Numero != 1)

    {

        if (((factorial + 1) % i == 0) && (Numero % i == 0))//es primo y divisible por i

        {

            while ((Numero % i) == 0)

            {

                al.Add(i);

                Numero = Numero / i; //vamos añadiendo mientras sea divisible.

            }

        }

        else

        {

            if (aumentar == 2)

            {

                factorial = factorial * (i) * (i + 1) * (i + 2) * (i + 3);

                aumentar = 4;

            }

            else

            {

                factorial = factorial * (i) * (i + 1);

                aumentar = 2;

            }

        }

        i += (ulong)aumentar;

    }

    if (Numero > 1) al.Add(Numero);

    return al;

}

Que es la implementación del algoritmo de buscar múltiplos primos. El número a factorizar era 291634147032428 y tarda aproximadamente 270 ticks 😉

http://eugenioestrada.es/blog

2 comentarios en “Solución reto factorízame”

  1. no hubiera sido mas optimo usando listas genericas?? … si, ya se que en el planteamiento del problema pedia array… pero igual pienso lo mismo….

    salu2

    Ddaz

  2. En este caso no creo ya que para mover 3 elementos no creo que haya mucha diferencia de un ArrayList a usar un genérico, si los divisores primos fuesen muchos más si que podría ser determinante.

    Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *