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 thoughts on “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!

Responder a eecsaky Cancelar respuesta

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