De esta manera, la ejecución del método generarVampiros(8, true, true, true) generará solamente números vampiros de 8 dígitos formados por la multiplicación de dos números de 4 dígitos que sean primos y que no contengan dígitos repetidos. En este caso, la respuesta del programa es la siguiente:
10.349.527 = 2.579 x 4.013
10.429.753 = 2.309 x 4.517
17.204.359 = 2.309 x 7.451
18.647.023 = 2.741 x 6.803
54.918.067 = 5.801 x 9.467
64.781.293 = 7.691 x 8.423
public static Vector<String> generarVampiros(int digitos, boolean vMitad,
boolean vPrimo, boolean vUnico) {
// vMitad: true para factores del mismo tamaño
// vPrimo: true para factores primos
// vUnico: true para factores sin dígitos repetidos
Vector<Integer> va, vb, vc;
Vector<String> respuesta = new Vector<String>();
long numFinal = (long) Math.pow(10,digitos)-1; // último vampiro posible
long numBase = (long) Math.pow(10,digitos-1); // primer vampiro posible
long numMin = (long) Math.pow(10,digitos/2-1); // menor factor tamaño n/2
long numMax = (long) Math.pow(10,digitos/2)-1; // mayor factor tamaño n/2
long factorInicialA=0;
long factorFinalA=0;
long factorInicialB=0;
long factorFinalB=0;
if(vMitad) {
factorInicialA = numMin;
factorFinalA = numMax;
}
else {
factorInicialA = 1;
factorFinalA = numFinal;
}
for(long a = factorInicialA; a<=factorFinalA; a++) {
if(vPrimo && !Algoritmos.esPrimoV6(a)) continue;
va = vectorDigitos(a);
if(vMitad) {
factorInicialB=Math.max(a+1,numBase/a);
factorFinalB=numMax;
}
else {
factorInicialB = Math.max(a+1,numBase/a);
factorFinalB = numFinal;
}
for(long b = factorInicialB; b<=factorFinalB; b++) {
if(vPrimo && !Algoritmos.esPrimoV6(b)) continue;
long c = a*b;
if(c>numFinal) { b=numFinal; continue; }
if(c<numBase) continue;
vb = vectorDigitos(b);
vc = vectorDigitos(c);
if(vUnico) {
Set<Integer> sa = new TreeSet<Integer>();
Set<Integer> sc = new TreeSet<Integer>();
sa.addAll(va);
sa.addAll(vb);
sc.addAll(vc);
if(sc.size()==digitos && sa.equals(sc)) {
respuesta.add(String.format("%,12d = %,6d x %,6d",c, a,b));
}
}
else {
for(int x: va) vb.add(x);
Collections.sort(vb);
Collections.sort(vc);
if(vb.equals(vc)) {
respuesta.add(String.format("%,12d = %,6d x %,6d",c, a,b));
}
}
}
}
Collections.sort(respuesta);
return respuesta;
}
No hay comentarios.:
Publicar un comentario