Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2008, 16:21   #1
SeRhy
Форумчанин
 
Аватар для SeRhy
 
Регистрация: 19.10.2007
Сообщений: 168
Вопрос Умножение длинных чисел в Pascal

Доброго времени суток всем.
У меня есть задание умножить два длинніх числа. я написал следующее:
Цитата:
program fact;
uses crt;
var m1,m2,d1,s,j:string;
mas1,mas2:array[1..100] of string[5];
dod1:array[1..100,1..100] of integer;
r:array[1..100] of integer;
i,n,z,cod:integer;
c1,c2,c3,l1,l2:integer;
begin
j:='';
writeln('Vvedit 2 chusla z novogo ryadka');
readln(m1);
readln(m2);
for i:=1 to length(m1) do mas1[i]:=copy(m1,i,1);
for i:=1 to length(m2) do mas2[i]:=copy(m2,i,1);
for i:=length(m2) downto 1 do
begin
val(mas2[i],c1,cod);
for z:=length(m1) downto 1 do
begin
val(mas1[z],c2,cod);
dod1[i,z]:=c1*c2;
end;
for z:=length(m2) downto 2 do
if dod1[i,z]>9 then
begin
dod1[i,z-1]:=dod1[i,z-1]+(dod1[i,z] div 10);
dod1[i,z]:=dod1[i,z] mod 10;
end;
d1:='';
for z:=1 to length(m2) do
begin
str(dod1[i,z],s);
d1:=d1+s;
end;
for z:=1 to length(m2)-i do d1:='0'+d1;
for z:=1 to length(d1) do val(copy(d1,z,1),dod1[i,z],cod);
l1:=length(m2);
l2:=length(d1);
end;
for i:=1 to length(m2) do
for z:=1 to length(d1) do
r[i]:=r[i]+dod1[z,i];
for z:=1 to length(j) do write(r[z]);
for z:=length(d1) downto 2 do
begin
if r[z]>9 then
begin
str(r[z],m1);
m2:=copy(m1,length(m1),1);
delete(m1,length(m1),1);
val(m2,r[z],cod);
val(m1,c3,cod);
r[z-1]:=r[z-1]+c3;
end;
end;
writeln;
for z:=1 to length(d1) do write(r[z]);
readln;
end.
Всё работает без ошибок но вот подсчитывает не правильно(
Я себе уде всю голову сломал но не смог найти ошибку.
Зарание спасибо за помощ
SeRhy вне форума Ответить с цитированием
Старый 04.12.2008, 15:27   #2
Sabber
Пользователь
 
Регистрация: 21.10.2008
Сообщений: 23
По умолчанию

Может надо использовать Longint?
Sabber вне форума Ответить с цитированием
Старый 04.12.2008, 23:50   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sabber
Может надо использовать Longint?
Если Вы не разобрались в коде и не понимаете, что означает термин "длинные" числа, то будьте добры, не давайте бесполезных советов!

SeRhy
1) нужны ли промежуточные результаты (я вижу, Вы пытаетесь по строчкам записать результаты умножения в двухмерный массив)???

2) ОЧЕНЬ рекомендую Вам заполнить массивы нулями и записывать исходные числа начиная с конца массивов mas1 и mas2...

Типа так. Вот. попробуйте программку:
Код:
program fact;
uses crt;
var m1,m2:string;
mas1,mas2:array[1..100] of string[5];
r:array[1..100] of integer;
i,j,cod,perenos : integer;
c1,c2               : integer;
begin
writeln('Vvedit 2 chusla z novogo ryadka');
readln(m1);
readln(m2);

for i:=1 to 100 do begin
  mas1[i] := '0';
  mas2[i] := '0';
  r[i] := 0;
end;
for i:=length(m1) downto 1 do mas1[100+i-length(m1)]:=copy(m1,i,1);
for i:=length(m2) downto 1 do mas2[100+i-length(m2)]:=copy(m2,i,1);
{LenMult := Length(m1)+Length(m2);}
for i:=100 downto 100-Length(m2) do begin
  val(mas2[i],c2,cod);
  for j:=100 downto 100-Length(m1) do begin
    val(mas1[j],c1,cod);
    r[j+i-100]:=r[j+i-100]+(c1*c2); {суммируем очередной разряд}
  end;
end;
writeln;

{выполним переносы разрядов}
perenos := 0;
for i:=100 downto 1 do begin
  r[i] := (r[i] + perenos);
  perenos := r[i] div 10;
  r[i] := r[i] mod 10;
end;

i:=1;
while (i<100) and (r[i]=0) do inc(i);
for j:=i to 100 do
  write(r[j]);
readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение длинных чисел SeRhy Помощь студентам 1 28.11.2008 20:04
[Pascal]Задача на строки случайных чисел Alyonka_v Помощь студентам 4 28.06.2008 00:58
Умножение длинных целых чисел Rifler Паскаль, Turbo Pascal, PascalABC.NET 1 04.06.2008 21:12
умножение 16-разрядных чисел deeeman Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.12.2007 13:26