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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 22:49   #1
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию Умножение длинных целых в паскале

Необходимо умножить два длинных целых числа в двоичной системе счисления в дополнительном коде. Программа считывает строку выделяет из нее число, переводит в двоичный вид в дополнительный код, перемножает и выдает результат в ДОПОЛНИТЕЛЬНОМ коде. Проверяла несколько раз. не могу понять почему он перемножает неправильно. Помогите пожалуйста, в чем ошибка?
Текст программы:
Код:
var
 temp,i,j: longint;
 n,n2,res:longint;
 s,s2,sim,sim2:string;
 alf:set of char;
 ch:char;
 p,p2,s1,s22,por,pr,apr,step,a,b,k:longint;
 apr2:integer;
 arr: array[1..10] of string;
begin
 alf:=['0'..'9'];
 Write('vvedite pervoe chislo: ');
 Readln(s);
 Write('vvedite vtoroe chislo: ');
 Readln(s2);
 n:=length(s);
 n2:=length(s2);
 sim:='';p:=0; sim2:=''; p2:=0;
 For i:=1 to n do                         {vudelenie cifr iz 1 stroki}
  If s[i] in alf then sim:=sim+s[i];
 For j:=1 to n2 do                        {vudelenie cifr iz 2 stroki}
  If s2[j] in alf then sim2:=sim2+s2[j];
 For i:=1 to length(sim) do begin         {perevod iz stroki v chislo (1)}
  s1:=ord(sim[i])-ord('0');
  p:=p*10+s1;
 end;
 For j:=1 to length(sim2) do begin        {perevod iz stroki v chislo (2)}
  s22:=ord(sim2[j])-ord('0');
  p2:=p2*10+s22;
 end;
 Writeln('chisla: ',p,' ',p2);
 a:=0; step:=1;n:=1;
 While p>=2 do begin                      {perevod iz 10i ss v 2ss (1)}
  pr:=p div 2;
  apr:=p-pr*2;
  a:=a+apr*step;
  p:=pr;
  step:=step*10;
  n:=n+1;
  If p=1 then a:=step+a;
 end;
 Writeln('dvoichnoe predstavlenie 1 chsla: ',a);
 step:=1; b:=0; por:=1;                      {perevod iz 10i ss v 2ss (2)}
 While p2>=2 do begin
  pr:=p2 div 2;
  apr:=p2-pr*2;
  b:=b+apr*step;
  p2:=pr;
  step:=step*10;
  If p2=1 then b:=step+b;
  por:=por+1;
 end;
 Writeln('dvoichnoe predstavlenie 2 chisla: ',b);
 Writeln('kolichestvo cifr 1: ',n);
 Writeln('                 2: ',por);
 apr:=a; pr:=a; a:=0; k:=1;         {perevod 1go chisla v dopolnitelnui kod}
 For i:=1 to n do begin
  apr:=pr mod 10;
  pr:=pr div 10;
  If apr=0 then apr2:=1;
  If apr=1 then apr2:=0;
  a:=a+apr2*k;
  k:=k*10;
 end;
 k:=a mod 10;
 If k=1 then begin
  apr:=0;
  a:=(a div 10)*10+apr;
 end;
 If k=0 then begin
  k:=1;
  a:=(a div 10)*10+apr;
 end;
 Writeln('v dopolnit kode 1: ',a);
  apr:=b; pr:=b; b:=0; k:=1;      {perevod 2go chisla v dopolnitelnui kod}
 For j:=1 to por do begin
  apr:=pr mod 10;
  pr:=pr div 10;
  If apr=0 then apr2:=1;
  If apr=1 then apr2:=0;
  b:=b+apr2*k;
  k:=k*10;
 end;
 k:=b mod 10;
 If k=1 then begin
  apr:=0;
  b:=(b div 10)*10+apr;
 end;
 If k=0 then begin
  k:=1;
  b:=(b div 10)*10+apr;
 end;
 Writeln('v dopolnit kode 2: ',b);
 res:=0;                                        {ymnozenie}
 k:=0;		
 n:=1;		
 while k<=por do begin
  temp:=n and b;
  if temp<>0
   then res:=res+a;	
  a:=a shl 1;		
  n:=n*2;		
  k:=k+1;
 end;
 writeln('rezyltat v dopolnitelnom kode: ',res);
 readln;
end.

Последний раз редактировалось Olven; 06.02.2012 в 23:15.
Olven вне форума Ответить с цитированием
Старый 06.02.2012, 23:10   #2
skyll
Пользователь
 
Регистрация: 05.02.2012
Сообщений: 28
По умолчанию

Блин, впадло во всем этом разбираться...
вот тебе код с делфи 2 - 10 когда то делал:

Код:
procedure TForm2.Button1Click(Sender: TObject);
  var i,dl,j,k:integer;
      ch,ch1:string;
      step,sum:real;
  begin
    ch1:='';
    dl:=length(Edit1.Text);
    for i:=1 to dl do
      begin
        ch:=Edit1.Text[i];
        ch1:=ch+ch1;
      end;
    sum:=0;
    for i:=1 to dl do
      begin
        ch:=ch1[i];
        if ch='1'
          then step:=exp((i-1)*ln(2));
        if ch='0'
          then step:=0;
        sum:=sum+step;
      end;
    Label1.Caption:=FloatToStr(sum);
  end;
2 -10:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,x,dl:integer;
    cod,cod1:string;
begin
  x:=StrToInt(Edit1.Text);
  cod:=''; cod1:='';
  if (x = 1) or (x = 0)
    then Label1.Caption:=IntToStr(x);
  if x > 1
    then begin
           repeat
             if x mod 2 = 1
             then cod:=cod+'1'
             else cod:=cod+'0';
             x:=x div 2;
           until (x = 1) or (x = 0);
           cod:=cod+'1';
           dl:=length(cod);
           for i:=dl downto 1 do
             begin
               cod1:=cod1+cod[i];
             end;
           Label1.Caption:=cod1;
         end;
end;
Может поможет...

Кстати, вставь свой код в ВВ код (#), это упростит чтение твоего кода... Если конечно код не линеечный)))
skyll вне форума Ответить с цитированием
Старый 06.02.2012, 23:14   #3
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от skyll Посмотреть сообщение
Блин, впадло во всем этом разбираться...
вот тебе код с делфи 2 - 10 когда то делал:

Код:
procedure TForm2.Button1Click(Sender: TObject);
  var i,dl,j,k:integer;
      ch,ch1:string;
      step,sum:real;
  begin
    ch1:='';
    dl:=length(Edit1.Text);
    for i:=1 to dl do
      begin
        ch:=Edit1.Text[i];
        ch1:=ch+ch1;
      end;
    sum:=0;
    for i:=1 to dl do
      begin
        ch:=ch1[i];
        if ch='1'
          then step:=exp((i-1)*ln(2));
        if ch='0'
          then step:=0;
        sum:=sum+step;
      end;
    Label1.Caption:=FloatToStr(sum);
  end;
2 -10:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i,x,dl:integer;
    cod,cod1:string;
begin
  x:=StrToInt(Edit1.Text);
  cod:=''; cod1:='';
  if (x = 1) or (x = 0)
    then Label1.Caption:=IntToStr(x);
  if x > 1
    then begin
           repeat
             if x mod 2 = 1
             then cod:=cod+'1'
             else cod:=cod+'0';
             x:=x div 2;
           until (x = 1) or (x = 0);
           cod:=cod+'1';
           dl:=length(cod);
           for i:=dl downto 1 do
             begin
               cod1:=cod1+cod[i];
             end;
           Label1.Caption:=cod1;
         end;
end;
Может поможет...

Кстати, вставь свой код в ВВ код (#), это упростит чтение твоего кода... Если конечно код не линеечный)))
блин, это что за код ? что он делает не поняла вообще.
я тут только зарегистрировалась,не разобралась как в вв вставлять) нет, код не линейный)
Olven вне форума Ответить с цитированием
Старый 06.02.2012, 23:46   #4
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию

разобралась
Olven вне форума Ответить с цитированием
Старый 06.02.2012, 23:58   #5
skyll
Пользователь
 
Регистрация: 05.02.2012
Сообщений: 28
По умолчанию

Сделала, все работает?)
skyll вне форума Ответить с цитированием
Старый 07.02.2012, 00:06   #6
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию

для беззнаковых да) нужно для отриц... в общем еще думать и думать)
Olven вне форума Ответить с цитированием
Старый 07.02.2012, 00:12   #7
skyll
Пользователь
 
Регистрация: 05.02.2012
Сообщений: 28
По умолчанию

А для отрицательных, можешь сделать так: убираешь минус, перемножаешь, и добавляешь минус (если он был один). А код выше, то код для Delphi, с двоичной в десятичную и обратно)
skyll вне форума Ответить с цитированием
Старый 07.02.2012, 00:15   #8
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию

так просто к сожалению не получится... умножение в дополнительном коде там правила определенные..
Olven вне форума Ответить с цитированием
Старый 07.02.2012, 00:18   #9
Olven
 
Регистрация: 06.02.2012
Сообщений: 8
По умолчанию

res:=0; {ymnozenie}
k:=0;
n:=1;
while k<=por do begin
temp:=n and b;
if temp<>0
then res:=res+a;
a:=a shl 1;
n:=n*2;
k:=k+1;
end;
можешь объяснить почему в этом блоке если вместо переменной por написать 8 допустим или другое число начинает правильно работать все. хотя por это как раз число того сколько это нужно все повторить. может ты увидишь что там
Olven вне форума Ответить с цитированием
Старый 07.02.2012, 00:25   #10
skyll
Пользователь
 
Регистрация: 05.02.2012
Сообщений: 28
По умолчанию

Что используешь? Какой компилятор?
skyll вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Tasm]Сложение/Умножение длинных чисел falcon92 Помощь студентам 0 17.11.2010 15:34
Умножение двух длинных целых чисел, представленных двунаправленными связанными списками Rifler Паскаль, Turbo Pascal, PascalABC.NET 0 28.05.2010 19:31
Умножение длинных чисел в Pascal SeRhy Помощь студентам 2 04.12.2008 23:50
Умножение длинных чисел SeRhy Помощь студентам 1 28.11.2008 20:04
Умножение длинных целых чисел Rifler Паскаль, Turbo Pascal, PascalABC.NET 1 04.06.2008 21:12