Lieber Pedaltreter,
sorry, es hat einige Tage gedauert, weil ich mir zu den Skripten einige Gedanken machen musste. Außerdem habe ich mit Pascal schon längere Zeit nicht mehr gearbeitet. Dennoch hat es recht gut geklappt.
Weiter unten habe ich Dir die Unit "bigInt" angehängt. Diese kann einfach in ein anderes Projekt eingebunden werden. Die Unit "bigInt" wird einfach in einer Uses - Klausel definiert und mit der Variable "intGlobal" angesprochen. Beispiel: wurzel := intGlobal.WurzelInteger('144');
Einzig die Routine "divisionReal" habe ich aus zeitlichen Gründen nicht mehr fertig gestellt, weil ich mir außerdem dachte, dass Du auch gerne etwas probieren möchtest. Eigentlich kann die Routine genauso arbeiten wie die "divisionInteger" - Routine, nur dass die Kommastellen berücksichtigt werden müssen. Dies sollte jedoch kein größeres Problem mehr sein.
Außerdem muss bedacht werden, dass die Routine "wurzelInteger" immer zur nächsten Ganzzahl aufrundet. Zum Beispiel kann die Wurzel aus 7 keine Ganzzahl sein, daher ist das Ergebnis 3; denn 2*2 = 4 und 3*3 = 9.
Du kannst außerdem die Routinen in einer ausführbaren Datei ausprobieren. Das gesamte Lazarus - Projekt habe ich Dir in ein Zip - Archiv gepackt und hier zum
Download aus der Cloud bereitgestellt.
Viel Spaß beim Ausprobieren und liebe Grüße,
das Sternenlicht...
Code: Alles auswählen
unit bigint;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, strUtils;
Type TIntegerGlobal = class(TObject)
Public
Function wurzelInteger(Const Number: String): String;
Function additionInteger(Const Number1, Number2: String): String;
Function subtraktionInteger(Const number1: String; Const number2: String): String;
Function multiplikationInteger(Const number1: String; Const number2: String): String;
Function divisionInteger(number1, number2: String): String;
Function isGreaterThan(number1, number2: String): Boolean;
Function isGreaterOrEqualThan(number1, number2: String): Boolean;
End;
Var intGlobal : TIntegerGlobal;
implementation
Function TIntegerGlobal.isGreaterThan(number1, number2: String): Boolean;
Var Index : Integer;
greater : Boolean;
Begin
greater := false;
While (number1[1] = '0') And (Length(number1) > 1) Do Delete(number1, 1, 1);
While (number2[1] = '0') And (Length(number2) > 1) Do Delete(number2, 1, 1);
If Length(number1) < Length(number2)Then greater := true;
If Length(number1) = Length(number2) Then
Begin
Index := 1;
While (number1[Index] = number2[Index]) And (Index < Length(number1)) Do inc(Index);
If number2[Index] > number1[Index] Then greater := true;
end;
isGreaterThan := greater;
end;
Function TIntegerGlobal.isGreaterOrEqualThan(number1, number2: String): Boolean;
Var Index : Integer;
greaterOrEqual : Boolean;
Begin
Index := 1;
greaterOrEqual := false;
While (number1[1] = '0') And (Length(number1) > 1) Do Delete(number1, 1, 1);
While (number2[1] = '0') And (Length(number2) > 1) Do Delete(number2, 1, 1);
If Length(number1) < Length(number2)Then greaterOrEqual := true;
If Length(number1) = Length(number2) Then
Begin
While (number1[Index] = number2[Index]) And (Index < Length(number1)) Do inc(Index);
If number2[Index] >= number1[Index] Then greaterOrEqual := true;
end;
isGreaterOrEqualThan := greaterOrEqual;
end;
Function TIntegerGlobal.additionInteger(Const number1: String; Const number2: String) : String;
Var ergebnis, erg : String;
p1, p2, p3, p4 : int64;
Index, Temp : int64;
Begin
ergebnis := '';
temp := 0;
p1 := Length(number1) + 1;
p3 := Length(number2) + 1;
While (p1 > 1) And (p3 > 1) Do
Begin
p1 := p1 - 1; p2 := p1;
p3 := p3 - 1; p4 := p3;
Index := 0;
While (p1 > 1) And (p3 > 1) And (Index < 17) Do Begin Inc(Index); Dec(p1); Dec(p3); End;
erg := intToStr(strToInt64(Copy(number1, p1, p2 - p1 + 1)) + strToInt64(Copy(number2, p3, p4 - p3 + 1)) + Temp);
While(Length(erg) < p2 - p1 + 1)Do erg := '0' + erg;
If(Length(erg) = p2 - p1 + 1) Then
Begin
ergebnis := erg + ergebnis;
Temp := 0;
End
Else Begin
ergebnis := Copy(erg, 2, Length(erg) - 1) + ergebnis;
Temp := 1;
End;
End;
While(Temp = 1) Do
Begin
If(p1 > 1)Then
Begin
Dec(p1);
Temp := Temp + strToInt64(Copy(number1, p1, 1));
If(Temp > 9) Then
Begin
Temp := Temp - 10;
ergebnis := intToStr(Temp) + ergebnis;
Temp := 1;
End
Else Begin
ergebnis := intToStr(Temp) + ergebnis;
Temp := 0;
End;
end;
If(p3 > 1) Then
Begin
Dec(p3);
Temp := Temp + strToInt64(Copy(number2, p3, 1));
If(Temp > 9) Then
Begin
Temp := Temp - 10;
ergebnis := intToStr(Temp) + ergebnis;
Temp := 1;
End
Else Begin
ergebnis := intToStr(Temp) + ergebnis;
Temp := 0;
End;
End;
If(p1 = 1) And (p3 = 1) And (Temp = 1) Then
Begin
Temp := 0;
ergebnis := '1' + ergebnis;
End;
End;
If(p1 > 1) Then
Begin
p2 := p1 - 1;
p1 := 1;
ergebnis := Copy(number1, 1, p2 - p1 + 1) + ergebnis;
End;
If(p3 > 1) Then
Begin
p4 := p3 - 1;
p3 := 1;
ergebnis := Copy(number2, 1, p4 - p3 + 1) + ergebnis;
End;
additionInteger := ergebnis;
end;
Function TintegerGlobal.subtraktionInteger(Const number1: String; Const number2: String): String;
Var ergebnis, erg : String;
p1, p2, p3, p4 : int64;
Index, Temp : int64;
Begin
ergebnis := '';
temp := 0;
p1 := Length(number1) + 1;
p3 := Length(number2) + 1;
While (p1 > 1) And (p3 > 1) Do
Begin
p1 := p1 - 1; p2 := p1;
p3 := p3 - 1; p4 := p3;
Index := 0;
While (p1 > 1) And (p3 > 1) And (Index < 17) Do Begin Inc(Index); Dec(p1); Dec(p3); End;
erg := intToStr(strToInt64('1' + Copy(number1, p1, p2 - p1 + 1)) - strToInt64(Copy(number2, p3, p4 - p3 + 1)) - Temp);
While(Length(erg) < p2 - p1 + 1)Do erg := '0' + erg;
If(Length(erg) = p2 - p1 + 1) Then
Begin
ergebnis := erg + ergebnis;
Temp := 1;
End
Else Begin
ergebnis := Copy(erg, 2, Length(erg) - 1) + ergebnis;
Temp := 0;
End;
End;
While(Temp = 1) Do
Begin
Dec(p1);
Temp := strToInt64('1' + Copy(number1, p1, 1)) - Temp;
If(Temp > 9) Then
Begin
Temp := Temp - 10;
ergebnis := intToStr(Temp) + ergebnis;
Temp := 0;
End
Else Begin
ergebnis := intToStr(Temp) + ergebnis;
Temp := 1;
End;
End;
If(p1 > 1) Then
Begin
p2 := p1 - 1;
p1 := 1;
ergebnis := Copy(number1, 1, p2 - p1 + 1) + ergebnis;
End;
subtraktionInteger := ergebnis;
end;
Function TIntegerGlobal.multiplikationInteger(Const number1: String; Const number2: String): String;
Var ergebnis, erg : String;
p1, p2, p3, p4 : int64;
Index : int64;
Begin
p1 := Length(number1) + 1;
ergebnis := '0';
While (p1 > 1) Do
Begin
p1 := p1 - 1; p2 := p1;
p3 := Length(number2) + 1;
Index := 0;
While (p1 > 1) And (Index < 8) Do Begin Inc(Index); Dec(p1); End;
While (p3 > 1) Do
Begin
p3 := p3 - 1; p4 := p3;
Index := 0;
While (p3 > 1) And (Index < 8) Do Begin Inc(Index); Dec(p3); End;
erg := intToStr(strToInt64(Copy(number1, p1, p2 - p1 + 1)) * strToInt64(Copy(number2, p3, p4 - p3 + 1)));
For Index := p2 + 1 To Length(number1) Do erg := erg + '0';
For Index := p4 + 1 To Length(number2) Do erg := erg + '0';
ergebnis := intGlobal.additionInteger(ergebnis, erg);
End;
End;
multiplikationInteger := ergebnis;
end;
Function TIntegerGlobal.divisionInteger(number1, number2: String): String;
Const maxInteger = '9223372036854775800';
Var pointer, Index, Zaehler : Integer;
Ergebnis, temp, Rest : String;
Begin
ergebnis := '0';
Rest := '';
While (number1[1] = '0') And (Length(number1) > 1) Do delete(number1, 1, 1);
While (number2[1] = '0') And (Length(number2) > 1) Do delete(number2, 1, 1);
For Index := 1 To Length(number2) - 1 Do Rest := Rest + number1[Index];
For Index := Length(number2) To Length(number1) Do
Begin
Rest := Rest + number1[Index];
temp := Rest;
Zaehler := 0;
While isGreaterOrEqualThan(number2, temp) Do
Begin
If isGreaterOrEqualThan(Rest, maxInteger) And isGreaterOrEqualThan(temp, maxInteger) Then
temp := intToStr(strToInt64(Rest) - strToInt64(number2))
Else
temp := subtraktionInteger(Rest, number2);
If isGreaterOrEqualThan('0', temp) Then inc(Zaehler);
Rest := temp;
end;
If Zaehler > 0 Then
Begin
temp := intToStr(Zaehler);
For pointer := Index + 1 To Length(number1) Do temp := temp + '0';
ergebnis := intGlobal.additionInteger(ergebnis, temp);
end;
end;
divisionInteger := Ergebnis;
end;
Function TIntegerGlobal.wurzelInteger(Const Number: String): String;
Var pos1, pos2 : Integer;
quadrat, ergebnis, divident, rest, temp, zErg : String;
found : Boolean;
Begin
quadrat := TrimLeftSet(Number, ['0']);
If(Length(quadrat) Mod 2 = 1) Then quadrat := '0' + quadrat;
pos1 := 1; Pos2 := 2;
divident := quadrat[pos1] + quadrat[pos2];
temp := '9';
ergebnis := '';
While isGreaterThan(divident, multiplikationInteger(temp, temp)) Do temp := subtraktionInteger(temp, '1');
ergebnis := temp;
rest := subtraktionInteger(Divident, multiplikationInteger(temp, temp));
While (Pos2 < Length(quadrat)) Do
Begin
Inc(pos1, 2); Inc(pos2, 2);
divident := rest + quadrat[pos1] + quadrat[pos2];
temp := divisionInteger(divident, multiplikationInteger('20', ergebnis));
found := false;
Repeat
zErg := multiplikationInteger(additionInteger(multiplikationInteger('20', ergebnis), temp), temp);
If isGreaterOrEqualThan(zErg, divident) Then
found := true
Else
temp := subtraktionInteger(temp, '1');
Until found;
temp := TrimLeftSet(temp, ['0']);
If temp = '' Then temp := '0';
ergebnis := ergebnis + temp;
rest := subtraktionInteger(divident, zErg);
end;
wurzelInteger := ergebnis;
end;
end.