Помощь - Поиск - Пользователи - Календарь
Полная версия: Умножение длинных чисел
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
priboltik
заранее прошу прощения, если создал тему не по разделу.. но все-таки.. вот процедура, с пом. которой я умножаю 2 длинных числа... она работает но не правильно... подскажите пожалуйста, где у меня ошибка..
отдельно каждое действие из этой процедуры(умножение на число, умножение на степень 10) работает..а вместе никак..
код:

Код
procedure TForm1.Button11Click(Sender: TObject);
var
k,j,n,l,i:integer;
rezyltat,chislo1,chislo2:string; massiv1,massiv2,massiv3,massiv4:array[1..100] of integer;
max,dlina1,dlina2,ostatok:integer;

begin
chislo1:=edit2.text;
chislo2:=edit3.Text;
ostatok:=0;
dlina1:=length(chislo1);
dlina2:=length(chislo2);
max:=dlina1+dlina2;
for i:=1 to max do massiv1[i]:=0;
for i:=1 to max do massiv2[i]:=0;
for i:=1 to max do massiv3[i]:=0;
for i:=1 to max do massiv4[i]:=0;
for i:=dlina1 downto 1 do
massiv1[max-dlina1+i]:=strtoint(chislo1[i]);
for i:=dlina2 downto 1 do
massiv2[max-dlina2+i]:=strtoint(chislo2[i]);
for i:=max downto max-dlina1 do
begin
for j:=max downto 1 do
begin
massiv3[j]:=(massiv1[j]*massiv2[i]+ostatok) mod 10;
ostatok:=(massiv1[j]*massiv2[i]+ostatok) div 10;
end;
for j:=1 to i-1 do begin
ostatok:=massiv3[1];
for k:=1 to max-1 do
massiv3[k]:=massiv3[k+1];
massiv3[max]:=ostatok;
end;
for l:=max downto 1 do
begin
massiv4[l]:=(massiv4[l]+massiv3[l]+ostatok) mod 10;
ostatok:=(massiv4[l]+massiv3[l]+ostatok) div 10;
end;
end;

for i:=1 to max do
insert(inttostr(massiv4[i]),rezyltat,i);
if rezyltat[1]='0' then delete(rezyltat,1,1);
label5.Caption:=rezyltat;

end;
volvo
Ты ошибся в 2-х местах (пока, по крайней мере, я нашел только это - с записанными значениями работает правильно...):
procedure TForm1.Button11Click(Sender: TObject);
var
  k,j,n,l,i:integer;
  rezyltat,chislo1,chislo2:string;
  massiv1,massiv2,massiv3,massiv4:array[1..100] of integer;
  max,dlina1,dlina2,ostatok:integer;
  T: integer;

begin
  chislo1:= '1234'; { edit2.text; }
  chislo2:= '53456'; { edit3.Text; }
  ostatok:=0;
  dlina1:=length(chislo1);
  dlina2:=length(chislo2);
  max:=dlina1+dlina2;
  
    for i:=1 to max do massiv1[ i ]:=0;
    for i:=1 to max do massiv2[ i ]:=0;
    for i:=1 to max do massiv3[ i ]:=0;
    for i:=1 to max do massiv4[ i ]:=0;
  
    for i:=dlina1 downto 1 do
      massiv1[max-dlina1+i]:=strtoint(chislo1[ i ]);
  
    for i:=dlina2 downto 1 do
      massiv2[max-dlina2+i]:=strtoint(chislo2[ i ]);
  
    for i:=max downto max-dlina1 do begin
      for j:=max downto 1 do begin
        massiv3[j]:=(massiv1[j]*massiv2[ i ]+ostatok) mod 10;
        ostatok:=(massiv1[j]*massiv2[ i ]+ostatok) div 10;
      end;
  
      { for j:=1 to i-1 do begin }
      for j:=1 to (max-i) do begin { <--- Это - первое... Был неправильный сдвиг }
        ostatok:=massiv3[1];
        for k:=1 to max-1 do
          massiv3[k]:=massiv3[k+1];
        massiv3[max]:=ostatok;
      end;


      for l:=max downto 1 do begin
        // massiv4[l]:=(massiv4[l]+massiv3[l]+ostatok) mod 10;
        T := (massiv4[l]+massiv3[l]+ostatok) mod 10; { <--- Это - второе... }
        ostatok:=(massiv4[l]+massiv3[l]+ostatok) div 10;
        massiv4[l] := T;
      end;
    end;

    for i:=1 to max do
      insert(inttostr(massiv4[ i ]),rezyltat,i);
    if rezyltat[1]='0' then delete(rezyltat,1,1);

  label5.Caption:=rezyltat;
end;
Во втором месте ошибка заключалась в том, что ostatok рассчитывался уже с НОВЫМ значением massiv4[L], а нужно использовать еще старое. Для этого я ввел дополнительную переменную T...
priboltik
а почему сдвиг так реализуется.. ведь в первый раз нам вообще не нужно сдвигать.. а затем.. по количеству цифр во втором числе??.. или я гоню??????? blink.gif
volvo
for j:=1 to (max-i) do begin
при первой итерации по i (i = max) сколько раз будет выполняться?

Ты запускал программу? Она работает?
priboltik
да..прога работает.. спасибо..
но я вот только не догоняю...ведь когда мы умножаем 1-ое число на последнюю цифру второго, нам же вообще не надо передвигать.. ведь так????
а мы передвигаем на длину второго числа.. blink.gif
volvo
Вопрос насчет цикла For мне еще раз повторить, или ты все-таки посмотришь САМ, чему на первой итерации равен I, и сколько раз будет выполняться цикл сдвига?
priboltik
все.. я прошу прощения.. я просто загнался. главный цикл ведь начинается с i:=max
тогда все правильно.. прошу прощения за тупизм..
респект и уважуха.. еще раз спасиба..smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.