| Autor |
Beitrag |
R3d0x
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 17.02.06 10:48
Hey
Ich habe mal eine Frage.Bin gerade dabei einen Rchner zu programmieren,der aber "dynamisch" ist.Das heißt,er sol lauch 10^100 Zahlen berechnen können,ohne irgendwie an byte,interger oder cardinal gebunden zu sein.
Hab erstmal eine mir paar Zahlen generieren lassen,die erstmal nur vierstellig sind,wenn es mit dneen geht,wirds ja auch mit großen Zahlen klappen.
Mein Problem ist folgendes.Hab jetzt in zwei Listen diese Elemente:
Liste1: 1 --> 0 --> 8 --> 2 ,also die Zahl 1082 ( oder 2801,hängt davon ab wie man es ließt,was jetzt egal ist)
Liste2: 3 --> 6 --> 3 --> 1 ,also die Zahl 3631 ( oder 1363,hängt davon ab wie man es ließt,was jetzt egal ist)
Jezt will ich die Zahlen addieren.das Problem ist bei mir jetzt bei den Zehnern, den 8+3 ist größer 10,also muss die 1 bleiben und die 1 rüber zur 6+0,also zu den hunderten.ICh will später von hinten lesen lassen.Ist jetzt egal obs zu den Zehnrn oder einsen rüber geht,ich weiß nur nicht wie ich es mache,dass er die 1 rüberschiebt.
Meine addierfunktion ist folgende:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.BtnAusrechnenClick(Sender: TObject); var ziffer1,ziffer2:word ; zahl:byte ; begin resetlist(liste1); resetlist(liste1); zahl:=0; while not endlist(liste1) and (not endlist(liste2))do begin readlist(liste1,ziffer1); readlist(liste2,ziffer2); zahl:=ziffer1+ziffer2; if zahl > 10 then begin zahl:=ziffer1+ziffer2-10; end ; advancelist(liste1); advancelist(liste2); edergebnis.text:=edergebnis.text + inttostr(zahl); end; end; |
--------
Wenn ich es also ausrechne,kommt bei mir dass ergebnis 4613,obwohl es 4713 oder 4614 sein müsste,hängt davon ab wo man die "1" rüberschiebt.
Ich hoffe ich konnte mein Problem erklären,und das ihr mir helfen könnt.Wenn irgendwie Fragen sind was ich überhaupt will,fragt nach,ich helfe gerne damit mir geholfen werden kann
Vielen Dank schon mal
mfg R3d0x
Moderiert von raziel: Delphi-Tags hinzugefügt
|
|
Spaceguide
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Fr 17.02.06 11:37
So in der Art:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.BtnAusrechnenClick(Sender: TObject); var ziffer1,ziffer2:word ; zahl,merker :byte; begin resetlist(liste1); resetlist(liste1); zahl:=0; merker := 0; while not endlist(liste1) and (not endlist(liste2))do begin readlist(liste1,ziffer1); readlist(liste2,ziffer2); zahl:=ziffer1+ziffer2+merker; if zahl > 10 then begin zahl:=ziffer1+ziffer2-10; merker := 1; end else merker := 0; advancelist(liste1); advancelist(liste2); edergebnis.text:=edergebnis.text + inttostr(zahl); end; end; |
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 17.02.06 11:41
Hallo,
Du musst Dir schon den Uebertrag merken.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TForm1.BtnAusrechnenClick(Sender: TObject); var ziffer1,ziffer2:word ; zahl:byte ; begin resetlist(liste1); resetlist(liste1); uebertrag := 0; while not endlist(liste1) and (not endlist(liste2))do begin readlist(liste1,ziffer1); readlist(liste2,ziffer2); zahl:=ziffer1+ziffer2+Uebertrag; if zahl >= 10 then begin zahl:=Zahl-10; uebertrag := 1; end else uebertrag := 0; advancelist(liste1); advancelist(liste2); edergebnis.text:=edergebnis.text + inttostr(zahl); end; If Uebertrag = 1 then edergebnis.text:=edergebnis.text + '1'; |
Uups, Spaceguide war schneller aber trotzdem heisst es '>= 10'
Gruss Horst
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 17.02.06 11:58
vielen dank für die hilfe.das mit dem übertrag hatte ich auch shcon mal versucht,aber das problem bleibt,denn wenn ich zb 4560 1621 addiere kann ich nciht einfach "ergebnis" + 1 machen,denn die 1 soll ja nicht zu den einsern,sondern zu den hunderten zb
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 17.02.06 12:15
Hallo,
wo hakt es, was ist daran falsch?
Die '1' wird doch nur im Abschluss addiert,also nach der while Schleife, falls ein Uebertrag bleibt.
Z.B.:
9999
1000 //1 rueckwaerts
00001 //10000 rueckwaerts
Gruss Horst
|
|
Spaceguide
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Fr 17.02.06 12:18
Horst, ich würde garnicht versuchen, den Code zu debuggen, das while-Schleifen-Argument ist auch falsch.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 17.02.06 12:23
Hallo,
Du hast ja recht BigInt units gibt es wie Sand am Meer.
Aber die Verstaendisfragen sollte man klaeren.
Die kommen sicher noch.
Gruss Horst
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 17.02.06 23:26
ich glaube,ich kann euch nicht ganz folgen,versthe bestimt was nicht.
aber ich meine, wenn ich zu 1095 + 10 mache,will ich 1105 haben, die +1 kommt nicht ans ende,sondern "in der mitte"
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: Sa 18.02.06 09:10
nur mal kurz als beispiel.addieren unterm strich
1789
+ 1321
------
2110
also musste der übertrag zuerst von den einsern zu den zehnern,dann von den zehnern zu den hunderten und von den hunderten zu tausendern.
ich kann ja dann nicht einfach if ..... ergebnis+1 machen
und noch ne frage,wie kann ich subtrahieren,irgendie funktioniert meine procedure nicht.hab die genau so versucht wie addieren,nur eben ziffer1-ziffer2.
sry,jetzt sinds schon zwei fragen
mfg R3d0x
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 19.02.06 09:33
morgen
weiß jetzt vielleicht einer wie ich den übertrag b eim addieren richtig mache?
oder wie man subtrahieren richtig macht?
die zwei sachen hätte ich grade.versuche später es nochmal selber zu schaffen
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 19.02.06 19:27
ich kann leider ohne zu wissen wie man den übertrag macht,nicht das subtrahieren programmieren.deshalb hoffe ich noch,jemand kann mir helfen
mfg R3d0x
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: So 19.02.06 19:43
Abgesehen davon, dass man das in der dritten Klasse lernt ist der Übertrag bei der Addition zweier Zahlen immer maximal 1, dass heißt du kannst das in nen boolean packen und diesen dann in jedem Schritt hinzuaddieren.
Psedocode:
neuziffer:=zahl1[i]+zahl2[i]+ord(uebertrag);
if neuziffer>9 then begin
result[i]:=neuziffer-10;
uebertrag:=true;
else begin
result[i]:=neuziffer;
uebertrag:=false;
end;
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 19.02.06 21:01
vielen dank,hab jetzt doch verstanden was ihr schon gestern gemeint habt.
meine frage wäre folgende:
wie erreiche ich,dass er nicht vorne leißt,sondern hinten anfängt,so wie man es beim addieren in der dritten klasse gelernt hat
mit irgendeiner schleife oder so,bin mir aber nicht sicher wie genau.irgendwie mit hilfe einer variable in der dann die listenelmente sind,aber zb 4-1 oder so.
wenn ich richtig liege,kann ich danach ans subtrahieren ran,ohne "rückwärts" gehts nicht beim subtrahieren
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 19.02.06 21:12
R3d0x hat folgendes geschrieben: | wie erreiche ich,dass er nicht vorne leißt,sondern hinten anfängt,so wie man es beim addieren in der dritten klasse gelernt hat
mit irgendeinerschleife oder so |
Delphi-Quelltext 1: 2: 3: 4:
| begin for a downto b do ... end; | 
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 19.02.06 21:23
ok,beim schreiben kommt man am besten auf die lösung
ich habe jetzt durch eine funktion die anzahl der lemte rausgelesen und in result abgespeichert.
nehmen wir an,es sind 4 elemente.
wie müsste die schleife sein?
result downto 1 ?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: So 19.02.06 21:30
genau
ich hatte mich vorhin übrigens vertippt: es sollte lauten:
Delphi-Quelltext 1: 2: 3: 4:
| begin for a := result downto 1 do ... end; |
diese schleife nützt dir aber auch nur etwas, wenn du die loop-variable "a" nutzt 
|
|
R3d0x 
Hält's aus hier
Beiträge: 15
|
Verfasst: So 19.02.06 21:45
ehrlich gesagt ( habt ihr bestimmt nie im leben vermutet ^^ ),weiß ich nciht genau,wie ich es in meine procedure reinbringe
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.BtnAusrechnenClick(Sender: TObject); var ziffer1,ziffer2:word ; zahl,uebertrag:byte ; begin
anzahlElementeListe(summand1); anzahlElementeListe(summand2); resetlist(summand1); resetlist(summand2); uebertrag := 0; while not endlist(summand1) and (not endlist(summand2))do begin readlist(summand1,ziffer1); readlist(summand2,ziffer2); zahl:=ziffer1+ziffer2+uebertrag;
if zahl >= 10 then begin zahl:=Zahl-10; uebertrag := 1; end else uebertrag := 0; advancelist(summand1); advancelist(summand2); edergebnis.text:=edergebnis.text + inttostr(zahl); end; If Uebertrag = 1 then edergebnis.text:=edergebnis.text + '1';
end; |
sry,bin doof
Moderiert von UGrohne: Delphi-Tags hinzugefügt.
|
|