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