Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   größerer Datentyp als Extended (https://www.delphipraxis.net/76462-groesserer-datentyp-als-extended.html)

Mussi0 4. Sep 2006 22:54


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

Meflin 4. Sep 2006 22:56

Re: größerer Datentyp als Extended
 
Moin!

Dafür gibt es mehrere sg. Hier im Forum suchenBigInt Units ;)


Mussi0 4. Sep 2006 22:59

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

Meflin 4. Sep 2006 23:09

Re: größerer Datentyp als Extended
 
Im Prinzip funktionieren die Units alle gleich. du bindest sie ein und kannst dann mit
Delphi-Quellcode:
Foo := TBigInt.Create('1234567890');
oder ähnlich einen BigInt erstellen und mit den Funktionen die in der Unit deklariert sind damit rechnen, z.B.
Delphi-Quellcode:
Foo1.Add(Foo2)
Das genaue verfahren ist allerdings von Unit zu Unit natürlich unterschiedlich ;)


Mussi0 5. Sep 2006 09:14

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

negaH 5. Sep 2006 12:18

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. http://www.michael-puff.de/Developer...agen_Reddmann/ -> Datei DEC_5_1c.zip

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

negaH 5. Sep 2006 14:46

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

Mussi0 5. Sep 2006 15:23

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:

negaH 5. Sep 2006 16:18

Re: größerer Datentyp als Extended
 
Zitat:

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?
Ja kannst du, dies wäre mein nächster Vorschlag gewesen um mathematische Palindrome zu erzeugen. Du baust quasi einen Addierer für Dezimalzahlen -> Strings die Dezimalzahlen enthalten.

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:
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
Gruß Hagen

jfheins 5. Sep 2006 16:28

Re: größerer Datentyp als Extended
 
Du könntest vorerst auch einfach einen Int64 verwenden, derreicht für die normalen Sachen bestimmt auch ... ;)

Mussi0 5. Sep 2006 16:31

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:

Ü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
d.h. doch nur das alle x-Werte in x^2 enthalten sind oder?

@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

negaH 5. Sep 2006 17:23

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