Project Euler -> Problema 5

Este dice:

2520 es el número más pequeño que puede ser dividido (sin resto) por todos los números desde el 1 al 10.
Cuál es el número positivo más chico que puede ser dividido por todos los números desde el 1 al 20?

Para éste se podrían usar las leyes que existen. En wikipedia salen las reglas, pero hasta el 13… pero si van a la versión en inglés, aparece hasta el 20 xD justo lo que necesitamos😉

Entonces vamos a hacer muuuuchos if anidados. Tomamos un número, y empezando por el 2, si se puede entramos al 3, después al 4 y así hasta llegar al 20. El primer número que se pueda  es el ganador😀

Al principio lo hice con preguntas onda: es divisible por 2? por 3? basándome en el resto (que fuera 0).  La idea de los algoritmos estos, es que no demores más de 1 minuto buscando la respuesta… y ps el mio se demora 33 segundos en llegar xD pero llega😯 aparte que el número es bastante grande…

public class Problema5 {
    public Problema5(){
        Boolean tamos = false; Long numero = 20l;
        while(!tamos){
            if (numero%2==0 && numero%3==0 && numero%4==0 && numero%5==0 && numero%7==0) {
                if (numero%8==0 && numero%9==0 && numero%10==0 && numero%11==0) {
                    if (numero%13==0 && numero%16==0 && numero%17==0 && numero%19==0 && numero%20==0) {
                        tamos=true;
                    }else numero +=1;
                }else numero +=1;
            }else numero +=1;
        } System.out.println(numero);
    }
}

Estoy convencido que es el código más horrible que han visto en su vida…  esto es Brute Force al 100% xD

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Java, Problemas Project Euler. Guarda el enlace permanente.

8 respuestas a Project Euler -> Problema 5

  1. julio dijo:

    A lapiz y papel se puede
    1*2*3*4*5*6*7*8*9*10 quiemos solo factores primos minimos
    si factorizamos encontramos que en 8 es 2^3 y 9 3^2 son los minimos
    1*2^3*3^2*5*7 = 2520
    1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20
    1*2^4*3^2*5*7*11*13*17*19 =232792560
    Nota : hay algunos problemas en euler que se necesita ser mas matematico que programador y viseversa

    • MaritoCares dijo:

      a ver a ver a ver
      Una pregunta solamente: ¿HICISTE LA MULTIPLICACIÓN EN PAPEL? xDD es que eres un masoquista hombre!

      Si… lo de matemático se me quedo en el Liceo x_X

      Gracias por el comentario y suerte con esas monstruosas multiplicaciones😯

  2. r4ito dijo:

    Veo que aun sigues desarrollando los problemas xD yo hice ese dia y nada mas, encontre que los problemas se pusieron muy matematicos y la dificultad estaba en entenderlos mas que como aplicarlos a la programación.

    Igual alcance a hacer este y lo hice casi igual que tu xD fuerza bruta ftw!. Pero en vez de escribir numero%x para cada del 1 al 20 hice un for (o algo equivalente en Ruby), algo como:

    **warning: no creo que este codigo funcione en java, solo estoy poniendo como supongo se escribe basado en tus codigos **

    Boolean tamos = false; Long numero = 19l;
    while(!tamos){
      numero += 1; tamos = true; /*asumimos que este numero es la respuesta*/
      for (int i = 2; i <= 20; i++){
        if(numero%i != 0){ tamos = false; break; } /*si uno falla, pasamos al siguiente*/
      }
    } System.out.println(numero);
    

    No se si break sera lo que se utiliza para romper un loop en java, pero se entiende la idea.

    Hay una cosa que queria preguntarte respecto de tu codigo java, en la parte Long numero = 19l; que representa esa esa “l” al final?.

    Bueno, saludos.

    • MaritoCares dijo:

      Bien dicho! Brute Force FTW xDDD
      Igual pensé en hacerlo con un ciclo, pero me dio miedo de que se me colgara todo x_X

      La l es para decirle a la JVM que trate el objeto como un Long. La verdad, no se para qué diantres si se supone ya es un Long… pero bue.

      Lo mismo con los Doubles y los Floats. No lo he probado con los primitivos, pero supongo es lo mismo…

      PD. me quede en el problema 7… principalmente porque me da miedo programar eso xDD (aunque ya se viene xD)
      Saludos

      • r4ito dijo:

        jajaja yo en el 7 me salve, porque ruby en el modulo de matemáticas trae algo de números primos así que me bastaron dos lineas:

        require 'mathn'
        puts Prime.first(10_001).last

        Si te puedo decir que la mayoria de los codigos que vi utilizaban tambien fuerza bruta, muy similar al codigo que puse en mi comentario anterior, pero con i yendo de 2 a raiz del numero, asi que suerte con ese ejercicio.

        A ver si luego me animo a hacer mas, saludos.

  3. double modulo = 0;
    bool bandera = true;
    double numero = 1;

    while(modulo > 0 || bandera )
    {
    modulo = 0;
    for(double i = 1; i0);
    if(!bandera)
    continue;

    numero++;

    }

    Console.WriteLine(” El número positivo más pequeño que es divisible por todos los números entre 1 y 20 es: {0}”,numero );
    Console.ReadLine();

  4. double modulo = 0;
    bool bandera = true;
    double numero = 1;

    while(modulo > 0 || bandera )
    {
    modulo = 0;
    for(double i = 1; i 0);
    if(!bandera)
    continue;

    numero++;

    }

    Console.WriteLine(” El número positivo más pequeño que es divisible por todos los números entre 1 y 20 es: {0}”,numero );
    Console.ReadLine();

  5. no se copia bien el comentario pero en el for(double i=1; i o); es
    for(double i = 1; i0);

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s