Project Euler -> Problema 8

Encuentra el producto más grande de 5 dígitos consecutivos dentro del número de 1000 dígitos

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Nop, no estoy leseando… ése es el problema 😯
La única forma que se me ocurrió… fue convertirlo a String, tomar los subString de 5, tomar cada caracter, transformarlo a Entero, multiplicarlos entre ellos, guardar el resultado en un ArrayList, ordenar el Array, leer la última posición… En pocas palabras eso fue lo que hice… and i’m not pride… xD

Bue, la cosa es que me resultó 😀 el código abajo

public class Problema8 {

    public Problema8(){
        String numero = "7316717653133062491922511967442657474235534919493"
                + "496983520312774506326239578318016984801869478851843"
                + "85861560789112949495459501737958331952853208805511"
                + "12540698747158523863050715693290963295227443043557"
                + "66896648950445244523161731856403098711121722383113"
                + "62229893423380308135336276614282806444486645238749"
                + "30358907296290491560440772390713810515859307960866"
                + "70172427121883998797908792274921901699720888093776"
                + "65727333001053367881220235421809751254540594752243"
                + "52584907711670556013604839586446706324415722155397"
                + "53697817977846174064955149290862569321978468622482"
                + "83972241375657056057490261407972968652414535100474"
                + "82166370484403199890008895243450658541227588666881"
                + "16427171479924442928230863465674813919123162824586"
                + "17866458359124566529476545682848912883142607690042"
                + "24219022671055626321111109370544217506941658960408"
                + "07198403850962455444362981230987879927244284909188"
                + "84580156166097919133875499200524063689912560717606"
                + "05886116467109405077541002256983155200055935729725"
                + "71636269561882670428252483600823257530420752963450";
        ArrayList<Integer> posibles = new ArrayList<Integer>();
        Integer digito = 0;
        Boolean terminamos = false;
        while(!terminamos){
            String digitos_5 = numero.substring(digito, digito+5);
            //System.out.print("Dígitos a evaluar: "+digitos_5);
            if (digitos_5.contains("0")) {
                //System.out.println(" Uno de los dígitos es 0, no sirven");
            }else{
                Integer producto = 1;
                for (int i = 0; i < 5; i++) {
                    producto *= Integer.valueOf(String.valueOf(digitos_5.charAt(i)));
                }
                posibles.add(producto);
                //System.out.println(" Multiplicación= "+producto);
            }
            if (digito!=995) {
                digito+=1;
            }else{
                terminamos = true;
            }
        }
        Collections.sort(posibles);
        //System.out.println("Número de productos: "+ posibles.size());
        System.out.print("El menor de ellos es: "+ posibles.get(0)+ " Y el mayor: "+
                posibles.get(posibles.size()-1));
    }
}

Me sorprendí al ver que el menor era 1… xD
Pueden descomentar las líneas para ver las salidas.

Y eso sería todo :B

 

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.

9 respuestas a Project Euler -> Problema 8

  1. ignorante dijo:

    Para calcular un máximo basta con guardar el máximo a medida que se siguen calculando y no todos en un arraylist hasta el final.

  2. ignorante dijo:

    Se me ocurre que si la suma de los dígitos es mayor, lo será también su multiplicación por lo que no haría falta multiplicar sino solo sumar. Está claro que el máximo será 99999 sí existiera.

    • MaritoCares dijo:

      Lo pensé también, pero no lo quise tomar.
      No lo hice con los 5 dígitos, pero suponte que sean 2 números:
      Tienes: 5+5, 6+4, 7+3, 8+2, 9+1. Todos suman 10, pero si los multiplicas te dan distintos valores.

      Puede que pase lo mismo con 5 dígitos, o puede que no… así que mejor no me arriesgué 😉

  3. helq dijo:

    Hola, estaba dando vueltas por hay por la red y encontré este blog, y al ver el título recorde el problema, he aquí mi respuesta en python 2.

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-

    numero = list("731671...)

    j = 0
    for i in range(994):
    k = (int(numero[i]) * int(numero[i + 1]) * int(numero[i + 2]) * int(numero[i + 3]) * int(n$
    if j < k:
    j = k
    print j

    Viendo las respuestas en project euler he encontrado una sentencia de dos renglones en python que no logro entender, wow me falta aprender muchoooo. bueno para eso es ese tipo de webs, para ayudarnos a desarrollar nuestro razocinio.

    Chaooo 🙂

  4. helq dijo:

    ouch, no aparece el indentado, mmm no sé que etiqueta usar así que cambio los espacios por raya_al_piso 😉


    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-

    numero = list("731671...)

    j = 0
    for i in range(994):
    ____k = (int(numero[i]) * int(numero[i + 1]) * int(numero[i + 2]) * int(numero[i + 3]) * int(n$
    ____if j < k:
    ________j = k
    print j

  5. helq dijo:

    Hagan caso omiso a mis dos comentarios anteriores, es que estoy en un live cd de chakra y no ha kedit ni gedit, sólo nano, disculpenme ;D


    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-

    numero = list("731671...)

    j = 0
    for i in range(994):
    ____k = (int(numero[i]) * int(numero[i + 1]) * int(numero[i + 2]) * int(numero[i + 3]) * int(numero[i + 4]))
    ____if j < k:
    ________j = k
    print j

Replica a helq Cancelar la respuesta