В FAQ'е (длинная арифметика) нашла функции для деления двух длинных чисел. Можете объяснить, как реализовать это в Delphi, желательно как объекты? Заранее спасибо.
Здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2428&view=findpost&p=31907 что, НЕ объекты?
Вот тут было показано, как заставить этот модуль работать в Дельфи: http://forum.pascal.net.ru/index.php?s=&showtopic=15485&view=findpost&p=90166 (читаем до конца)
+ в http://forum.pascal.net.ru/index.php?showtopic=6361 тоже кое-что было по-моему, если хочешь - скачай, посмотри..
Но в Hugeobj только умножение , деления нет (оно есть выше, но вроде не через объекты). А как можно переделать ?
Мне тоже нужно это деление. Я нашла в DRKB модуль, начала компилировать, но в тех скобках, где есть HugeIntCarry возникает ошибка "Left side cannot be assigned to". Например:
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+}... И будет тебе счастье
// А дальше - без изменений
Спасибо, volvo! Все откомпилировалось.
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.
volvo, мне кажется, вы уже поняли, кто был гостем
Не смейтесь, но я не знаю где создать файл с расширение in...
Я попробовала добавить код из DRKB, но у меня не получилось его использовать , а HugeObj добавила нормально.
В общем, я опять прошу о помощи...
p.s. не... посмеяться надо мной все-так нужно)))
1) Как называются у тебя входной/выходной файл?
2) Вот мой проект, попробуй - что выдаст в файле d.txt:
test.rar ( 3.15 килобайт )
Кол-во скачиваний: 431
Еще раз спасибо! До свидания. Утро уже как ни как.
p.s. а цитаты все равно потом убирала, сразу не догадалась)))
Входной я назвала d1.text, а выходной - d.text.
А теперь еще посмейся. Я тогда не догадалась, что нужно открыть и посмотреть свой выходной файл, думала результат на экране будет)))
В общем я все проверила. Работает. Вот что выдает:
Нет... Просто я что-то не так портировал. Исходная программа (без объектов) считает как положено...
Сейчас проверю...
Да, так и есть... Модуль, строка №242 -
ost:=c;
ost.X^:=c.X^;
Спасибо! Я исправила.
Теперь у меня такой вопрос. Мои длинные числа (это факториалы вычисленные с помощью HugeObj) имеют тип TLargeInt. Числа в dlinna имеют тип TObj. Компил-р пишет, что типы не совместимы. Как можно это исправить?
Убрать использование TLargeInt и пользоваться только TObj, или наоборот, убрать TObj, и пользоваться только TLargeInt... Эти 2 типа несовместимы и не будут... Пользуйся только одним из двух модулей...
Показать, как вычисляется факториал с использованием TObj?
Буду пользоваться dlinna.
Это - не метод объекта, просто процедура, описанная в Interface - части модуля (чтобы иметь к ней доступ извне), так же, как и та, что присутствует в HugeObj ...
{ 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;
Добавить строку в Fact:
{ 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;
volvo, спасибо тебе огромное!!!
Я наконец-то доделала свою программу! Ура
p.s. специфика русского человека - делать все в последний момент (завтра мне сдавать эту работу))))