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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2008, 16:43   #1
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию "Длинные" числа в ТР

подскажите, пожалуйста, как в паскале реализовать сложение целых чисел длинной до 20 знаков. Не могу сообразить, как организовать ввод.
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Старый 06.09.2008, 18:02   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Если только сложить, то можно хранить число как строку и складывать столбиком.
Sibedir вне форума Ответить с цитированием
Старый 06.09.2008, 21:32   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Лови, может поможет, а может не поможет:
BIGINT.zip
Работает только с положительными целыми числами.

Даю наводку
Можно изменить тип TChislo:
Код:
TChislo = array [0..256] of Byte;
В нулевом элементе можно хранить признак знака: 0 - плюс, 1 - минус. Но тогда придется доработать и ввод, и вывод числа, и сумму. Добавится разность. А вообще лучше число как записть сделать.
Код:
TZnak = (zP, zM);

TChislo = record
  Value: array [1..256] of Byte;
  Znak: TZnak;
end;
Sibedir вне форума Ответить с цитированием
Старый 28.09.2008, 09:25   #4
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию

сложение и вычитание я сделал. осталось умножение. никак не могу найти ошибку в логике.

Код:
procedure proiz(a,b:string; var c:string);
type mas=array[0..255] of integer;
var sl1,sl2,rez:mas;
    i,j,n,pr,k:byte;
    prom:array[0..246]of string;
    fl:boolean;
procedure str1(s:string; var t:mas);
var i,k:integer;
   begin
   for i:=length(s) downto 1 do
     val(s[i],t[i],k);
   end;
procedure str2(t:mas;n:byte; var s:string);
var i:byte; st:string;
    begin
    s:='';
    i:=1;
    for i:=1 to n-1 do begin
    str(t[i],st);
    s:=s+st;
    end;
end;
     begin
      str1(a,sl1);
      str1(b,sl2);
      n:=0;
      for i:=length(b) downto 1 do begin
          for k:= 0 to 255 do
              rez[k]:=0;
          for j:=length (a) downto 1 do begin
              pr:=sl1[i]*sl2[j]+rez[j];
              fl:=(pr>10);
              if fl then rez[j+1]:=(pr)div 10;
              rez[j]:=pr;
              n:=n+1;
              end;
           str2(rez,n,prom[i]);
           for k:=1 to length(a)-i+1 do
               prom[i]:=prom[i]+'0';
           end;
      fl:=true;
      n:=0;
      for i:=length(a) downto 0 do begin
      pr:=sl1[i]+sl2[i];
      if fl then rez[i]:=pr mod 10
       else rez[i]:=(pr+1)mod 10;
      fl:=(pr<10)or((pr+1)<10);
      n:=n+1;
      end;
      str2(rez,n,c);
     end;
он не умножает, а складывает, почему-то
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Старый 28.09.2008, 10:51   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

У Вас последний цикл, по-моему, чистое сложение, остальные результаты отбрасываются.


Нужно что-то вроде этого:
Код:
   n:=0;
   for i:= 0 to 255 do rez[i]:=0;           // Обнуляем результат
   for i:=length(b) downto 1 do begin
      p := 0; m := n;

      for j:=length (a) downto 1 do begin
         // произведение текущих разрядов + предыдущий перенос + результат предыдущей операции
         pr := sl1[i]*sl2[j] + p + rez[m];
         rez[m] := pr mod 10;
         p := pr div 10;
         inc(m);
      end;

      // Обработка переноса
      while p > 0 do begin
         pr := p + rez[m];
         rez[m] := pr mod 10;
         p := pr div 10;
         inc(m);
      end;

      inc(n);
   end;
alexBlack вне форума Ответить с цитированием
Старый 28.09.2008, 11:39   #6
Cannibal
Форумчанин
 
Регистрация: 17.02.2008
Сообщений: 191
По умолчанию

Спасибо Большое
Mathematicians often mix up Christmas and Halloween, because Dec.25=Oct.31.
Cannibal вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Помогите!Срочно! "Составьте программу получения в порядке убывания всех делителей данного числа" koston Паскаль, Turbo Pascal, PascalABC.NET 2 26.03.2008 12:34
Программа "Совершенные числа" Reaper_Man Помощь студентам 4 22.12.2007 00:38
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49