Етерналко, может и оптимальнее, в паскаль не вставлял, ибо ты юзаешь сдесь динамический массив, а они появляются только в делфи, т.е. в паскале тебе выдаст ошибку
Нужно указывать от 1 .. и до какого-то определенного числа. (кстати я пробывал считать в программе число в переменную, потом вызвать процедуру, и сделать массив 1..та переменная. Всеравно не вышло, хотя переменную я считал раньше нежели определил массив, и значение так же передал в процедуру, т.е. в делфи/Си все было бы Окей.
Негетив, Я написал процедуру умножения. Только трабл такой получается. Считает оно все правильно, но только если массивы до 10. Т.е. мое "длинное" число максимум из 10 цыфр. Если больше 10 и где-то до 250 - просто виснет (долго очень думает, я так и не дождался результат. Если же больше 250 - даже не компилируется, сразу кидает ошибку, что мало памяти. А все (на сколько я понимаю) из-за двумерного массива.
Вот мои две процедуры:
Это рандом, который по заданому n генерирует число из n цыфр:
Procedure rndm(n1, n2: integer);
var i,temp: integer;
f: text;
begin
randomize;
assign(f, 'c:\in.txt');
rewrite(f);
writeln(f, n1);
writeln(f, n2);
temp:= 0;
while temp = 0 do
temp:= random(9);
write(f, temp,' ');
for i:= 2 to n1 do
write(f, random(9),' ');
writeln(f);
temp:= 0;
while temp = 0 do
temp:= random(9);
write(f, temp,' ');
for i:= 2 to n2 do
write(f, random(9),' ');
close(f);
end;
И вторая, это уже само умножение:
Procedure umnoj;
var f,g: text;
i,j,k,l,x,y,p,s: integer;
a,a1,b,b1: array [1..max] of byte;
c: array [1..max,1..max] of byte;
go_on: boolean;
begin
assign(f, 'c:\in.txt');
assign(g, 'c:\out.txt');
reset(f);
rewrite(g);
for k:= 1 to max do
begin
a[k]:= 0;
a1[k]:= 0;
b[k]:= 0;
b1[k]:= 0;
end;
for k:= 1 to max do
for l:= 1 to max do
c[k,l]:= 0;
readln(f, i);
readln(f, j);
for k:= 1 to i do
read(f, a1[k]);
for k:= 1 to j do
read(f, b1[k]);
for k:= 1 to max do
begin
a[max-i+k]:= a1[k];
a1[k]:= 0;
end;
for k:= 1 to max do
begin
b[max-j+k]:= b1[k];
b1[k]:= 0;
end;
p:= 0;
s:= 0;
for l:= max downto 1 do
begin
for k:= max downto 1 do
begin
p:= a[k]*b[l]+p;
c[k-s,max-l+1]:= p mod 10;
p:= p div 10;
end;
inc(s);
end;
for l:= max downto 1 do
begin
a1[l]:= 0;
for k:= 1 to max do
a1[l]:= a1[l]+c[l,k];
end;
go_on:= true;
l:= max;
p:= 0;
while go_on do
begin
a1[l]:= a1[l]+p;
p:= a1[l] div 10;
a1[l]:= a1[l] mod 10;
dec(l);
go_on:= not ((p=0) and (a1[l]=0));
end;
for l:= 1 to max do
write(g, a1[l]);
close(f);
close(g);
end;
главная программа:
var n1,n2: integer;
begin
write('Vvedite dlinnu 1 chisla: ');
readln(n1);
write('Vvedite dlinnu 2 chisla: ');
readln(n2);
rndm(n1, n2);
umnoj;
end;
Не пойму что может быть не так :?