IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Умножение длинных чисел, Помогите с реализацией алгоритма..
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской
Реальное имя: Константин

Репутация: -  1  +


заранее прошу прощения, если создал тему не по разделу.. но все-таки.. вот процедура, с пом. которой я умножаю 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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ты ошибся в 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...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской
Реальное имя: Константин

Репутация: -  1  +


а почему сдвиг так реализуется.. ведь в первый раз нам вообще не нужно сдвигать.. а затем.. по количеству цифр во втором числе??.. или я гоню??????? blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






for j:=1 to (max-i) do begin
при первой итерации по i (i = max) сколько раз будет выполняться?

Ты запускал программу? Она работает?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской
Реальное имя: Константин

Репутация: -  1  +


да..прога работает.. спасибо..
но я вот только не догоняю...ведь когда мы умножаем 1-ое число на последнюю цифру второго, нам же вообще не надо передвигать.. ведь так????
а мы передвигаем на длину второго числа.. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Вопрос насчет цикла For мне еще раз повторить, или ты все-таки посмотришь САМ, чему на первой итерации равен I, и сколько раз будет выполняться цикл сдвига?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 58
Пол: Мужской
Реальное имя: Константин

Репутация: -  1  +


все.. я прошу прощения.. я просто загнался. главный цикл ведь начинается с i:=max
тогда все правильно.. прошу прощения за тупизм..
респект и уважуха.. еще раз спасиба..smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.09.2017 8:56
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"