martes, octubre 05, 2010

Números Vampiros

Los números vampiros son aquellos números con número par de dígitos que son resultado del producto de dos enteros de igual número de dígitos y que tienen como característica que están formados en su totalidad por los dígitos que conforman a sus dos factores.

Por ejemplo, para el caso de los números de 4 dígitos existen 7 números vampiros que se calculan así:

15 x 93 = 1.395
21 x 60 = 1.260
21 x 87 = 1.827
27 x 81 = 2.187
30 x 51 = 1.530
35 x 41 = 1.435
80 x 86 = 6.880

En este programa en JAVA se presenta una aproximación a la generación de números vampiros de 6 dígitos, pero que puede ser fácilmente configurable para generar números vampiros de cualquier tamaño. Para efectos de prueba el programa genera los números en un arreglo de cadenas, solamente por la facilidad de mostrar los factores que lo producen, pero también puede ser modificado para generar solamente los números vampiros en un arreglo o vector de números enteros o enteros grandes:


import java.util.*;

public class Vampiros {
    public static void main(String[] args) {
        Vector<String> respuesta = generarVampiros(6);
        System.out.println(respuesta.size());
        for(String x: respuesta) {
            System.out.println(x);
        }
    }
    public static Vector<String> generarVampiros(int digitos) {
        Vector<Integer> va, vb, vc;
        Vector<String>  respuesta = new Vector<String>();
        int numFinal = (int) Math.pow(10,digitos)-1;
        int numMin   = (int) Math.pow(10,digitos/2-1);
        int numMax   = (int) Math.pow(10,digitos/2)-1;
        for(int a = numMin; a<=numMax; a  ) {
            va = vectorDigitos(a);
            for(int b = a+1; b<=numMax; b  ) {
                int c = a*b;
                if(c>numFinal) { b=numFinal; continue; }
                vb = vectorDigitos(b);
                vc = vectorDigitos(c);
                for(int x: va) vb.add(x);
                Collections.sort(vb);
                Collections.sort(vc);
                if(vb.equals(vc)) {
                    respuesta.add(String.format("%,6d x %,6d = %,8d",a,b,c));
                }
            }
        }
        return respuesta;
    }

    public static Vector<Integer> vectorDigitos(int tmp) {
        int x=tmp;
        Vector<Integer> respuesta = new Vector<Integer>();
        while(x>=1) {
            respuesta.add(x % 10);
            x/=10;
        }
        return respuesta;
    }
}

2 comentarios:

  1. Hola JorgeP
    Excelentes apuntes sobre programación, tus ejemplos de algoritmos están muy completos y fáciles de entender!!

    ResponderBorrar
  2. Yo no consigo entender lo que es un número vampiro ni como se hace y mucho menos entiendo el porqué del algoritmo

    ResponderBorrar

Multiprocesamiento recursivo en JAVA 7

Una de las estrategias de diseño de algoritmos más comunes es la de "divide y vencerás", en la cual, un problema de tamaño relativ...