Vampirzahlen berechnen
-
Hi,
hier ist Aufgabe 10 des Kapitels "Controlling Execution" in Thinking in Java 4th Edition:
A vampire number has an even number of digits and is formed by multiplying a pair of numbers containing half the number of digits of the result. The digits are taken from the original number in any order.
Pairs of trailing zeroes are not allowed. Examples include:
1260 = 2160
1827 = 2187
2187 = 27*81
Write a program that finds all the 4-digit vampire numbers.Ich hab das folgendermaßen gelöst:
import java.util.*; public class Vampire { public static void main(String[] args) { for(int i = 11; i < 100; ++i) { for(int j = 11; j <= i; ++j) { String product = Integer.toString(i*j); String app = Integer.toString(i) + Integer.toString(j); char[] capp = app.toCharArray(); Arrays.sort(capp); int index = 0; boolean foo = true; for(int k = 0; k < capp.length; ++k) { if(k > 0 && capp[k] == capp[k-1]) { index = product.indexOf(capp[k], index) + 1; } else { index = product.indexOf(capp[k]) + 1; } if(index == 0) foo = false; } if(foo == true) System.out.println(i + " * " + j + " = " + product); } } } }
Nur ging das Kapitel über triviale Dinge wie Operatoren, Casting, Schleifen und Bedingungen und ich habe einige Sachen benutzt, die noch nicht im Buch vorgestellt wurden. Deshalb kommt mir meine Lösung viel zu kompliziert vor.
Gibt es einen einfacheren Weg, die Aufgabenstellung zu lösen?
MfG,
Michael E.
-
Ich würde beide Strings sortieren und dann zeichen-(ziffern-)weise miteinander vergleichen. Wenn die sortierte Version von
app
undproduct
identisch ist, hast du eine Vampirzahl.
-
Stimmt, das wär einfacher. Trotzdem wurden noch keine Stringmethoden außer toCharArray() vorgestellt. Deshalb wunder ich mich, dass ich z. B. sortieren muss.
MfG,
Michael E. (weg bis morgen)
-
Du mußt nicht, aber es ist schneller Natürlich kannst du auch von zwei unsortierten Arrays ausgehen und jede Ziffer von 'app' einzeln in 'product' suchen (nur mußt du dabei aufpassen, daß doppelte Ziffern auch doppelt gefunden werden, sonst erkennst du fälschlicherweise Zahlen wie 1089=11*99 als Vampirzahl).
-
Ok, danke für die Bestätigung.
-
(Gehört vielleicht nicht hier hin, aber trotzdem)
Wieviele Vampir-Zahlen hast Du gefunden ?
-
http://en.wikipedia.org/wiki/Vampire_number schrieb:
The vampire numbers are (sequence A014575 in OEIS):
1260, 1395, 1435, 1530, 1827, 2187, 6880, 102510, 104260, 105210, 105264, 105750, 108135, 110758, 115672, 116725, 117067, 118440, 120600, 123354, 124483, 125248, 125433, 125460, 125500, ...
-
Besten Dank für den Link. Von selbst hätte ich ihn niemals gefunden weil es mir seltsam vorkommt, "Vampirzahlen" (oder ähnlich) als Suchbegriff irgendwo einzugeben :-).
Bei meinem Ansatz habe ich die Zähler und das Ergebnis jeweils in einem Array, so dass ich Zahlen mit Zahlen vergleichen kann und somit eine Konvertierung entfällt.
Allerdings hat meine "geniale" Vergleichsfunktion die 6880 als Vampirzahl übersehen, so dass ich auf 6 statt 7 vierstellige Vampirzahlen kam.
Codebeispiele kann ich nicht zeigen weil ich es nicht mit JAVA gelöst habe.