![]() |
größerer Datentyp als Extended
Hallo zusammen,
ich bin gerade an meine Grenzen gestossen und zwar soll mein Programm ein Palindrom erstellen. Also sowas z.B. : 789 + 987 = 1776 ---------------------------------------------------------------- 1776 + 6771 = 8547 ---------------------------------------------------------------- 8547 + 7458 = 16005 ---------------------------------------------------------------- 16005 + 50061 = 66066 ---------------------------------------------------------------- ---------------------------------------------------------------- PALINDROM: 66066 Mein Problem ist nun, es kann natürlich sein das dass Palindrom so groß wird das es 1. nicht mehr in den Integer-Wert passt 2. nicht mehr in den Extended-Typ. Es wäre schön wenn Ihr mir helfen könntet!!! Gruß Muss!0 |
Re: größerer Datentyp als Extended
|
Re: größerer Datentyp als Extended
Ahh...Danke das ging echt schnell..
ehmmm...wie funktioniert das denn?? muss ich dann die Unit einbinden und dann auf die Funktionen darin zugreifen? Gruß Muss!0 |
Re: größerer Datentyp als Extended
Im Prinzip funktionieren die Units alle gleich. du bindest sie ein und kannst dann mit
Delphi-Quellcode:
oder ähnlich einen BigInt erstellen und mit den Funktionen die in der Unit deklariert sind damit rechnen, z.B.
Foo := TBigInt.Create('1234567890');
Delphi-Quellcode:
Das genaue verfahren ist allerdings von Unit zu Unit natürlich unterschiedlich ;)
Foo1.Add(Foo2)
|
Re: größerer Datentyp als Extended
ahh...jetzt hab ichs verstanden, also wie ich die
Units einbinde und im allgemeinen Nutze wusst ich schon nur leider konnte ich nichts damit anfangen wie ich diese BigInt-Unit nutze!!! Vielen Vielen Dank das hat mir sehr geholfen.... Gruß Muss!0 |
Re: größerer Datentyp als Extended
Suche mal nach meinem DECMath, das dürfte für dich intuitiver zu benutzen sein und bei weitem schneller als TBigInt in den mathm. Berechnungen.
![]() Aber mal ne andere Frage: Wie erzeugst du deine Palindrome mathematisch ? also mit welchem Algorithmus ? Ich frage weil du nämlich dafür garnicht rechnen musst, also garkeine BigInt/IInteger oder sowas benötigst. Betrachte mal deine Zahlen einfach als Strings die nur aus Ziffern bestehen können. Wir wissen zb. das wenn die Ziffern '5' +'3' = '8' erzeugt werden an letzter Stelle im String, das logischerweise an erster Stelle im String also eine '5' +'3' = '8' stehen muß. Dein Problem reduziert sich bei Strings mit gerader Länger also auf eine reine Spiegelung und eben die ausschließliche Berechnung von einzelnen Ziffern als Zeichen. Gruß Hagen |
Re: größerer Datentyp als Extended
Beispiel:
wir gehen Top-Down vor, also erzeugen per Zufall einen Zahlen String wie zb. "2345" und spiegeln diesen -> "2345" + "5432" ergibt "23455432". Nun wollen wir 2 Palindrome erzeugen die addiert exakt diese Zahl ergibt. Wir nehmen "12044021" und erzeugen "2" - "1" = "1" "3" - "2" = "1" "4" - "0" = "4" "5" - "4" = "1" unser Palindrom ist also "11411411" + "12044021" = "23455432", fertig ohne Berechnungen großer Zahlen. Klar dürfte sein das dieser einfach Algo. nicht alle Palindrome erzeugen kann, aber eben sehr viele und sehr große ohne aufwendige Zahlenberechnungen und auf direktem Wege ohne Trial&Error ! Gruß Hagen |
Re: größerer Datentyp als Extended
Hallo...
wenn ich doch nun 2345 habe als Integer bzw. überhaupt als Zahlwert kann ich diesen dann doch zur Laufzeit dann in einen String umwandeln diesen dann "umdrehen" und dann wieder in eine Zahl und diese dann addieren also dann: 2345 + 5432 = 7777 und nicht 23455432 sicher ist dies auch ein Palindrom ABER ein schriftlicher und nicht (wie ich es möchte einen mathematischen!!). Aber ich werde mich jetzt mal umsehen nach dieser DECMath und werde es damit probieren trotzdem vielen Dank!!! Gruß Muss!0 PS: Könnte ich nicht einfach ohne eine Zahlenwert-Variable zu nutzen 2 Strings nehmen und die einzelnen Stellen darin wie im dritten Schuljahr zusammenaddieren? Oder dürfte diese Methode zu langsam sein? :gruebel: Hatte was vergessen!! :wink: |
Re: größerer Datentyp als Extended
Zitat:
Aber sag mal, oben baust du ein Palindrom indem du sukzessive so lange gespiegelte Zahlen addierst bis ein echtes Palindrom entsteht. Ist dies Absicht und eine gundlegende Bedingung für deinen Algo ? Wenn nicht dann kanst du so ein Palindrom in jedem Falle direkt berechnen, das beduetet dann auch das du nur die gewünschte Anzahl an Ziffern eingibst und ein Palindrom per Zufall erzeugt würde, in einem Schritt. Bei deiner Methode kann es sehr sehr lange dauern bis man ein großes Palindrom erzeugt hat. Übrigens im DECMath DEMO findest du einen Algo. für Automorphe Zahlen, das sind Zahlen der Form X' = X^2 wobei alle Ziffern von X als Ziffern in X^2 enthalten sind. Zb.
Code:
Gruß Hagen
X = 42576 57676 91038 90995 89338 00226 07743 74008 17871 09376
X² = 18127 64889 37539 71252 85535 50988 19268 32151 66459 22506 42576 57676 91038 90995 89338 00226 07743 74008 17871 09376 |
Re: größerer Datentyp als Extended
Du könntest vorerst auch einfach einen Int64 verwenden, derreicht für die normalen Sachen bestimmt auch ... ;)
|
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 05:46 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