web 2.0

martes, 9 de marzo de 2010

Números palindrómicos


En projecteuler.net se ofrece el siguiente problema:
Un número palindrómico se lee de la misma forma en ambos sentidos. El palíndromo más grande a partir del producto de dos números de 2 dígitos es 9009 = 91 x 99.
Encontrar el palíndromo más grande a partir del producto de dos números de 3 dígitos.
A continuación les planteo la solución original que yo hice antes de acertar a la respuesta y poder ver la solución que se plantea en la misma página una vez resuelto el problema!


public Set calcularPalindromosNumerico(Integer min, Integer max){
        Set <Integer>listaPalindromos = new HashSet<Integer>();
        for(int i = min; i <= max; i++ ){
            for(int j = min; j <= max; j++){
                Integer res = j*i;
                if(isPalindromo(res))
                    listaPalindromos.add(res);
            }
        }
        return listaPalindromos;
    }


Lo primero que cabe resaltar en el método anterior es que utilizamos una clase “Set” con el único propósito de no almacenar resultados repetidos (100*110 y 110*100 por ejemplo) [Recordamos que la clase Set no almacena datos duplicados]. Lo segundo que hay que notar es que el método recibe objetos envoltorio Integer. Esto es así ya que la lista que contendrá los números palindrómicos no estará ordenada y usaremos al método estático “sort” de la clase Arrays para ordenar dicho arreglo, pero para que lo anterior funcione, los elementos a ordenar deben implementar a la InterfazComparable según nos lo indica la documentación de la clase Arrays, así pues, los envoltorios de los tipos primitivos implementan a esta interfaz y es por ello que el método recibe objetos Integer en lugar de int.
Por último, creamos otro método que permita validar si un número es palindrómico.

public boolean isPalindromo(int numero){
        String palindromo = ReverseString.reverseIt(
                String.valueOf(numero));
 
        if(numero == Integer.parseInt(palindromo))
            return true;
        else
            return false;
    }

ReverseString es una clase que podemos encontrar aquí
Lo único que nos resta hacer es crear el método main que nos permita comprobar el resultado:

public static void main(String []args){
        Palindromo palindromo = new Palindromo();
        Object[] listaPalindromos = palindromo.calcularPalindromosNumerico
                                (100,999).toArray();
 
        Arrays.sort(listaPalindromos);
        for(Object i : listaPalindromos){
            System.out.println(i);
        }
    }

El 100 y 999 que se pasan como argumentos al método, esta claro que es el primero y último número de 3 cifras que existen!
De esta forma, obtenemos que el palíndromo más grande resultado de la multiplicación de dos números de tres cifras es: 906609
En la misma página de project euler , se proporciona un PDF con el algoritmo que da solución al problema! Pero este PDF solo lo podremos ver una vez que hayamos acertado a la respuesta!
Como complemento, para hallar números palindrómicos, existe el 196-Algorithm que pueden revisar como lectura adicional!
Saludos!!

0 comentarios:

Publicar un comentario