Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
|
Re: größerer Datentyp als Extended
5. Sep 2006, 18:23
Ok, ein kurzer Blick ins WEB brachte einige Seiten zum Vorschein, es gibt sehr viel Infos zur diesen Palindromen (naja gibt ja auch leute die Millionen Stellen von Pi berechnen oder sonstwas).
So wie es aussieht wirst du mit DECMath oder BigInt nicht effizient zum Ziel kommen. Du benötigst eine spezielle Zahlenrepräsentation, dezimal im Speicher möglichst effizient gepackt als BCDs mit einer Ziffer pro Nibble eines Bytes, und eben einen schnelle Funktion die nun diese Zahlen addieren kann. Diese Funktion sollte also die Zahl selber mit ihrem Spiegelbild addieren können.
In einem Cardinal können wir somit Zahlen bis 99999999 abspeichern, in einem Int64 Zahlen bis 9999999999999999. Die Berechnung der Spiegelbildzahl beschränkt sich nun darauf die Nibbles dieser Cardinal zu vertauschen. Dafür gibt es sehr effiziente Verfahren die OHNE Schleifen auskommen.
Dann benötigst du noch eine Funktion die überprüfen kann ob eine solche Zahl ein Palindrom darstellt, am besten gleich als Resultat in der spezielisierten Additions-Funktion.
Dieser Weg ist aber dann immer noch eine sogennante "Brute Force" Suche, da man probiert einfach alle Zahlen durch um die entsrechenden Palindrome zu erzeugen. Ich persönlich mag sowas nicht und preferiere den exakten mathem. Weg der dann per Formel direkt solche Palindrome oder ganze Gruppen von solchen berechenen kann. Dummerweise scheint dies nicht möglich, nch scheinen sich Mathematiker mit diesem Problem intensiv befasst zu haben. Es gibt also keinen echten math. Weg.
Auf alle Fälle ein interessantes Problem.
DECMath's interne Repräsentation der Zahlen ist zur Basis 2^32, also echte Binärzahlen. Damit ist DECMath für dein Problem mit Dezimalzahlen nicht effizient genug. Für binäre Palindrome aber wiederum sehr geeignet. In deinem Falle müsstest du nach jeder Addition die IInteger Zahl mit NStr(Zahl, 10) in einen Dezimalstring konvertieren und dann testen ob die Zahl ein Palindrom ist. Das ist aber ineffizient (obwohl die funktion NStr() sehr effizient ist, weitaus effizienter als das was ich in anderen Libs gesehen habe). Leider lässt sich mathm. diese Umwandlung der Binären IInteger Zahlen zur Basis 10 nicht vermeiden. Dieses Problem wirst du mit allen Bibliotheken haben die intern nicht im dezimalen Zahlensystem arbeiten.
Gruß Hagen
|