Pascal:длинная арифметика — различия между версиями

Материал из synset
Перейти к: навигация, поиск
Строка 15: Строка 15:
  
  
 +
== Длинная арифметика
 +
==
  
 +
Длинная арифметика - раздел программирования позволяющий удобно работать с числами которые не могут быть помещены в стандартные типы языка. Ниже представлен код программы реализующий сложение двух чисел, длина которых ограничивается только оперативной памятью.
  
  
Строка 22: Строка 25:
 
== А+В ==
 
== А+В ==
 
   
 
   
Длинная арифметика - раздел программирования позволяющий удобно работать с числами которые не могут быть помещены в стандартные типы языка. Ниже представлен код программы реализующий сложение двух чисел, длина которых ограничивается только оперативной памятью.
+
 
  
 
<pre class="brush:pascal; gutter: false;">
 
<pre class="brush:pascal; gutter: false;">

Версия 12:27, 21 февраля 2010

Длинная арифметика








== Длинная арифметика

==

Длинная арифметика - раздел программирования позволяющий удобно работать с числами которые не могут быть помещены в стандартные типы языка. Ниже представлен код программы реализующий сложение двух чисел, длина которых ограничивается только оперативной памятью.



А+В


program A+B;

var
   s1,s2:string;
   a,b:array[1..100] of integer;
   len,i,c:integer;
   f1,f2:text;
begin
   Assign(f1,'INPUT.TXT');  Reset(f1);
   Assign(f2,'OUTPUT.TXT'); ReWrite(f2);
   c:=0;
   ReadLn(f1,s1);
   ReadLn(f1,s2);
   close(f1);
   len:=length(s1);                      {разбиение строк в елементы массивов}
   for i:=1 to len do
      a[len-i+1]:=Ord(s1[i])-48;
   len:=length(s2);
   for i:=1 to len do
      b[len-i+1]:=Ord(s2[i])-48;

   if length(s1)>length(s2) then len:=length(s1)
   else len:=length(s2);
   for i:=1 to len do
    begin
      c:=c+a[i]+b[i];         {переменная c будет в дальнейшем использоваться для переноса числа в следующия ряд}
      a[i]:=c mod 10;         {результат сложения запишем в массив а} 
      c:=c div 10;
    end;
   if c>0 then begin
      len:=len+1;
      a[len]:=c;
    end;
   for i:=len downto 1 do     {вывод результата в файл}
      Write(f2,a[i]);
   close(f2);
end.

А-В

Данная программа осуществляет нахождения разности двух больших чисел.


program A-B;


Function CompLong(s1,s2:string):integer; {функция CompLong сравнивает две строки как большие числа}
Label
    Lb;
var
   a,len1,len2,i:integer;
begin
   a:=0;
   len1:=length(s1);
   len2:=length(s2);
   if len1>len2 then begin a:= 1; goto LB end;
   if len1<len2 then begin a:=-1; goto LB end;
   for i:=1 to len1 do begin
      if Ord(s1[i])-48>Ord(s2[i])-48 then begin a:= 1; break; end;
      if s1[i]<s2[i] then begin a:=-1; break; end;
   end;
   Lb:
   CompLong:=a;
end;

var
   s1,s2:string;
   i,len,c,x:integer;
   a,b:array[1..1000] of integer;
   f1,f2:text;
begin
   Assign(f1,'INPUT.TXT'); Reset(f1);
   Assign(f2,'OUTPUT.TXT'); ReWrite(f2);
   ReadLn(f1,s1); c:=0;
   ReadLn(f1,s2);
   close(f1);
   len:=length(s2);
   for i:=1 to len do
      b[len-i+1]:=Ord(s2[i])-48;
   len:=length(s1);
   for i:=1 to len do
      a[len-i+1]:=Ord(s1[i])-48;
   if Complong(s1,s2)<0 then begin
      Write(f2,'-');
      len:=length(s2);
      for i:=1 to len do begin
         x:=a[i];
         a[i]:=b[i];
         b[i]:=x;
      end;
   end;
   for i:=1 to len do
    begin
      c:=c+a[i]-b[i]+10;
      a[i]:= c mod 10;                       {результат будет храниться в массиве a}
      if c < 10 then c:=-1 else c:=0;
    end;
   while (a[len]=0) and (len>1) do len:=len-1;
   for i:=len downto 1 do {вывод результата в файл}
      Write(f2,a[i]);
   close(f2)
end.

А*В

Следующая программа проводит умножение двух больших чисел

program A*B;

var
   f1,f2:text;
   s1:string;
   b,i,c:integer;
   a:array[0..105] of integer;
begin
   Assign(f1,'INPUT.TXT');  Reset(f1);
   Assign(f2,'OUTPUT.TXT'); ReWrite(f2);
   c:=0;
   ReadLn(f1,s1);
   ReadLn(f1,b);
   close(f1);
   a[0]:=length(s1);
   for i:=1 to a[0] do
      a[a[0]-i+1]:=Ord(s1[i])-48;

   for i:=1 to a[0] do
    begin
      a[i]:=c+a[i]*b;
      c:=a[i] div 10;
      a[i]:=a[i] mod 10;
    end;
   While c>0 do
   begin
      a[0]:=a[0]+1;
      a[a[0]]:=c mod 10;
      c:=c div 10;
   end;
   if a[a[0]]=0 then Write(f2,0)
   else
   for i:=a[0] downto 1 do
    Write(f2,a[i]);
   close(f2);
end.

На основе этих программ могут быть созданы программы нахождения факториала, возведения в степень и т.д. позводяющие работать с большими числами.