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