
procedure HugeInt_Inc(var a: HugeInt);
{ a := a + 1 }
var
i: Integer;
h: Word;
begin
i := 0;
h := 1;
repeat
h := h + a[i];
a[i] := Lo(h);
h := Hi(h);
Inc(i);
until (i > HugeIntMSB) or (h = 0);
HugeIntCarry := h > 0; // вот тут например
{$IFOPT R+ }
if HugeIntCarry then
RunError(215);
{$ENDIF}
end; { HugeInt_Inc }
{$J+}... И будет тебе счастье
// А дальше - без изменений
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Dlinna;
var
a, b, c, d: TObj;
f_out: text;
begin
{ TODO -oUser -cConsole Main : Insert code here }
assign(input,'d.in');reset(input);
assign(f_out, 'd.txt');rewrite(f_out);
a.Init; b.Init; c.Init; d.Init;
a.ReadLong(input);
a.WriteLong(f_out);
b.ReadLong(input);
b.WriteLong(f_out);
c.DivLongTwo(a,b,d);
writeln(f_out, 'results:');
c.WriteLong(f_out);
d.WriteLong(f_out);
close(f_out);
close(Input);
a.Done; b.Done; c.Done; d.Done;
end.
ost:=c;
ost.X^:=c.X^;
{ A := n! }
procedure Fact(Var A: TObj; n: LongInt);
var T: TObj; i: LongInt;
begin
T.Init;
{
Вот это, конечно не очень красиво, надо бы как-то сделать
инициализацию TObj обычным числом... Но работает...
}
T.X^[1] := 1;
T.X^[0] := 1;
for i := 2 to n do begin
A.MulLongShort(T, i);
T.X^ := A.X^;
end;
end;
{ А вот это - уже метод объекта, не забывай его описание добавить в Type TObj }
Function TObj.HugeToStr: String;
var ls,s:string;
i:integer;
begin
result := '';
str(_osn div 10, ls);
result := result + IntToStr(X^[X^[0]]);
for i:=X^[0]-1 downto 1 do
begin
str(X^[i],s);
while length(s)<length(ls) do s:='0'+s;
result := result + s;
end;
end;
type
Tlong=array[0 .. _maxdig]of integer;
Plong=^Tlong;
TObj = object
Constructor Init;
Destructor Done;
Function HugeToStr: String; // вот тут?
procedure ReadLong(var f:text);
procedure WriteLong(var f:text);
...
private
X: PLong;
end;
procedure Fact(Var A: TObj; n: LongInt); // и вот тут?
procedure TForm12.Button2Click(Sender: TObject);
var n: longint;
per: TObj;
begin
if edit4.text='' then
begin
MessageBeep(MB_ICONHAND);
ShowMessage('Не заданы значения!');
end
else
begin
memo1.Text:='';
n:=StrToInt(edit4.Text);
if n>524 then ShowMessage('Невозможно вычислить для данного числа! Приносим свои извинения.')
else
begin
Fact(per, n);
memo1.Text:=per.HugeToStr; //эту
end;
end;
end;
begin
per.Init;
Fact(per, n);
memo1.Text := per.HugeToStr;
end;
procedure TForm12.Button3Click(Sender: TObject);
var m,n: longint;
f1,f2,ost,raz: TObj;
begin
if (edit5.text='') or (edit6.text='') then
begin
MessageBeep(MB_ICONHAND);
ShowMessage('Не заданы значения!');
end
else
begin
memo2.Text:='';
m:=StrToInt(edit5.Text);
n:=StrToInt(edit6.Text);
f1.Init; f2.Init; ost.Init; raz.Init;
fact(f1, m);
fact(f2, m-n);
raz.DivLongTwo(f1,f2,ost);
memo2.text:=raz.HugeToStr;
end;
end;
Function TObj.HugeToStr: String;
var ls,s:string;
i:integer;
begin
result := '';
str(_osn div 10, ls);
result := result + IntToStr(X^[X^[0]]);
for i:=X^[0]-1 downto 1 do
begin
str(X^[i],s); //эта
while length(s)<length(ls) do s:='0'+s;
result := result + s;
end;
end;
{ A := n! }
procedure Fact(Var A: TObj; n: LongInt);
var T: TObj; i: LongInt;
begin
T.Init;
T.X^[1] := 1;
T.X^[0] := 1;
for i := 2 to n do begin
A.MulLongShort(T, i);
T.X^ := A.X^;
end;
A.X^ := T.X^; // <-- Вот эту !!!
end;