![]() |
Re: größerer Datentyp als Extended
Also in meinen Algo geht es im Grunde darum
das der Nutzer einfach eine mind. dreistellige Zahl eingibt und dann wird so wie ich das schon mal geschrieben habe zusammen addiert. Zitat:
@jfheins: leider nicht da meine Zahlen über die 20 stellen gehen und ich nicht weiß wie groß die Werte werden können. Gruß Muss!0 |
Re: größerer Datentyp als Extended
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz