web 2.0
Mostrando entradas con la etiqueta Matemáticas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Matemáticas. Mostrar todas las entradas

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!!

domingo, 7 de marzo de 2010

Project Euler: Matemáticas y Programación


Project Euler es una página que consta de más de 200 problemas matemáticos, que por su dificultad en el número de operaciones y cálculos, no son posibles de resolver sin la ayuda de la programación!
Hace 2 días recién me inscribí, así que al día de escribir esta entrada, solo llevo 5 ejercicios resueltos! Desde luego que he iniciado con los más fáciles!
Lo interesante de esto es que para entrar a un nivel “novice” debes tener entre 100 a 149 problemas resueltos! De lo contrario, estarías en el nivel 1 o 2 los cuales no son tan válidos, ya que si en un lapso de 60 días no resuelves ningún problema, desapareces del record! El nivel 3 es el nivel “novice” y en este nivel es cuando ya puedes quedar inmortalizado en el score sin importar el tiempo que ha pasado desde la última vez que resolviste un problema!
Para muestra del tipo de ejercicios, he aquí el primero que resolví el cual es un verdadero regalo!
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.
public class Multiplo {
    public int sumarMultiplos(int rango, int numeroUno, int numeroDos){
        int suma = 0;
        for(int i = 1; i
Como ven, se trata de un problema bastante sencillo! Estaré poniendo en este blog todos los problemas que vaya resolviendo! Aunque solo lo hago cuando tengo por ahí un tiempo libre!
Saludos!!