![]() |
Addition zweier beliebig großer Zahlen
Hi Leute,
leider brauche ich noch mehr Hilfe mit meiner Klausur. Ich brauche einen Ansatz für diese Aufgabe, die mein Lehrer wahrscheinlich aus dem Delphi Kochbuch geklaut hat. Es sollen zwei Zahlen mit beliebiger (aber gleicher) Stellenzahl addiert werden.( Erzeuge zB. zwei 100 stellige Zufallszahlen ) Wir speichern die Ziffern als 'char' mit den Einern zuerst jeweils in einem Keller.Beim Auskellern werden die Ziffern stellenrichtig addiert unter Berücksichtigung des Übertrages. Wenn ihr ne Idee habt, wie man das hinkriegen kann, dann könnt ich die Hilfe gut gebrauchen. Mein erste Idee war mit "div" und "mod" zu arbeiten, um die Einzelstellen zu in Zehner und Einer einzuteilen, aber ich bin schon beim Erzeugen der 100-Stelligen Zahlen gescheitert. Danke! :spin: |
Hallo VeeJay,
Ich würde das Problem nach der Grundschul aditionsmethode machen: Man wandle die beiden Zahlen in strings um, dann fängst du von ganz hinten an und addierst immer die jeweiligen Ziffern an der Stelle der schleifenvariable. Wenn mehr als 10 rauskommt, dann speicherst du eine 1 in einer variable, und addierst die dann beim nächsten Mal mit dazu. Alles was bei der Addition der beiden Ziffern über 10 geht, bei 16 also 6 ist dann der neue Wert. Den speicherst d udann immer in einen neuen string an der selben Stelle. Und am Ende Wandelst du dann einfach den String wieder in einen Integer oder Longint um. Gruß Jan [edit] ups, hatte das: Zitat:
BB Jan |
Hoi
also wenn ich das richtig verstanden habe: Nimm doch eine Forschleife:
Delphi-Quellcode:
for i:=1 to 100 do
begin zahl1 := zahl1 + inttostr(random(9)); end; |
Moin VeeJay,
sollte so gehen:
Delphi-Quellcode:
Ich hoffe es ist einigermassen verständlich.
var
acNum1 : array [1..100] of char; acNum2 : array [1..100] of char; acResult : array [1..101] of char; // Das Ergebnis kann eine Stelle länger sein! bCarry : byte; bDigit1 : byte; bDigit2 : byte; i : integer; begin // Zufällige einhunderstellige Zahlen erzeugen Randomize; for i := 1 to 100 do begin // ASCII Code von 0 bis 9 = 48 bis 57, deshalb + 48 acNum1[i] := chr(Random(10)+48); acNum2[i] := chr(Random(10)+48); end; bCarry := 0; // Übertrag initialisieren for i := high(acNum1) downto low(acNum2) do begin // Ziffern auslesen bDigit1 := ord(acNum1[i])-48; bDigit2 := ord(acNum2[i])-48; // Addieren, aber nur die letzte Ziffer ins Ergebnis schreiben acResult[i+1] := chr(((bDigit1+bDigit2+bCarry) mod 10)+48); // ggf. den Übertrag auf 1 setzen bCarry := ord((bDigit1+bDigit2+bCarry) > 9); // Variante: // bCarry := (bDigit1+bDigit2+bCarry) div 10; end; // den Wert für die höchste Stelle setzen acResult[1] := chr(bCarry+48); ShowMessage('Zahl1: '+acNum1+#13#10+'Zahl2: '+acNum2+#13#10+'Summe: '+acResult); end; |
Was dann ja so ziemlich genau das ist, was ich vorgeschlagen hatte, nur als Code präsentiert :D
BB Jan |
Moin Jan,
stimmt. Da ich schon mal eine Bibliothek für grosse Zahlen angefangen hatte, hatte ich das nur schon, einigermassen, fertig vorliegen. @VeeJay Was ist eigentlich mit "Keller" gemeint? |
Zitat:
Keller kenne ich als Speicher bei theoretischer Befassung von Alphabeten, z.B. die Klammersetzung in Delphi. Wenn ihr jetzt keinen Schimmer habt, wovon ich rede, dann ist das auch egal :] Gruß Jan |
Erstmal danke für die Antworten.
Also den Begriff "Keller" hab ich mir nicht selbst ausgedacht. Mein Info-Lehrer nennt eine dynamische Pointerkette, die aus aneinander gereiten Records besteht und nach dem LastInFirstOut Prinzip ausliest, Keller. Weil er denkt, in einem Keller holt man auch als erstes das raus, was man als letztes hereingelegt hat. Das liegt halt am nächsten zum Eingang. Da er aber immer nur Keller sagt, kenn ich den richtigen Begriff nicht ;) MFG Tim |
Zitat:
|
Zitat:
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 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