Показать сообщение отдельно

  #7  
Старый 21.02.2009, 23:37
eLWAux
Постоянный
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме:
5111568

Репутация: 2399


По умолчанию

Длинная арифметика
программа для считивания, вывода и сравнения двух длинних положительных числел

pascal:
Код:
program crypt_lab1;

uses
   crt;

const
   MaxDig = 1000;  { максимальное количество цифр }
   Osn    = 10000; { основание нашей системы счисления }

type
   TLong = array[0..MaxDig] of integer;

 { считивание длинного числа с файла }
 procedure ReadLong(filename :string; var a:TLong);
 var i  :integer;
     F  :text;
     ch :char;
 begin

     for i:=0 to MaxDig do a[i]:=0;
     a[0]:=1;

     assign(F, filename);
     reset(F);
     while not eof(F) do begin
           read(F,ch);

           for i:=a[0] downto 1 do begin
               a[i+1] := a[i+1] + ( longint(a[i]) *10) div Osn;
               a[i]   := ( longint(a[i]) *10) mod Osn;
               end;

           {val(ch,temp,temp); a[1] := a[1] + temp;}
           a[1] := a[1] + ord(ch) - ord('0');
           if (a[a[0]+1]>0) then inc(a[0]);

    end;
    close(F);

 end;


 { вывод длинного числа на экран из массива}
 procedure WriteLong(var a :TLong);
 var ls,s:string; i:integer;
 begin
      str( Osn div 10, ls);
      write(a[a[0]]); {starwa cufra}
      for i:=a[0] - 1 downto 1 do begin
          str(a[i], s);
          while length(s)<length(ls) do
                s:='0'+s;
          write(s);
      end;
      writeln;
 end;

  { сравнения двох дл. чисел: a == b }
 function Eq(a,b :TLong):boolean;
 var
    i:integer;
 begin
      Eq := false;
      if ( a[0]<>b[0] ) then exit;

      { a[0] == b[0] }
      for i:=1 to a[0] do
       if (a[i] = b[i]) then
         Eq := i = a[0];
 end;

  { сравнения двох дл. чисел: a > b }
 function More(a,b :TLong):boolean;
 var i :integer;
 begin
      if ( a[0]>b[0] ) then More:=true else
                            More:=false;
      for i:=a[0] downto 1 do
          if (a[i]<>b[i]) then
          begin
             if (a[i]>b[i]) then More:=true else More:=false;
             break;
          end;
 end;

  { сравнения двох дл. чисел: a > b }
 function Less(a,b :TLong):boolean;
 var i :integer;
 begin
      Less := Not(More(a, b) Or Eq(a, b))
 end;

  { сравнения двох дл. чисел: a >= b }
 function More_Eq(a, b : TLong) : boolean;
 begin
		More_Eq := More(a, b) Or Eq(a, b)
 end;

  { сравнения двох дл. чисел: a <= b }
 function Less_Eq(a, b : TLong) : boolean;
 begin
	Less_Eq := Not More(a, b)
 end;

 { сложения двух длинних чисел: a + b }
 procedure Sum2Long(var a,b :TLong; var c :TLong);
 var i,k:integer;
 begin
      for i:=0 to MaxDig do  { aHaJlor:                     }
          c[i] := 0;         {   fillchar(c, sizeof(c), 0); }

      if a[0]>b[0] then k:=a[0] else k:=b[0];
      for i:=1 to k do begin
          c[i+1] := (c[i] + a[i] + b[i]) div osn;
          c[i] := (c[i] + a[i] + b[i]) mod osn;
      end;
      if (c[k+1] = 0) then c[0]:=k else c[0] := k+1;
 end;

var
   a,b,c :TLong;
   i     :integer;

begin
   clrscr;

   ReadLong('num1.txt',a);
   ReadLong('num2.txt',b);
   write('a   = ');  WriteLong(a);
   write('b   = ');  WriteLong(b);

   Sum2Long(a,b,c);
   write('a+b = ');  WriteLong(c);

   writeln( 'a > b ', More(a,b) );
   writeln( 'b > a ', More(b,a) );
   writeln( 'c > b ', More(c,b) );
   writeln( 'c > a ', More(c,a) );

   readln;
end.
пример входних данных:
num1.txt: 102030405060708090
num2.txt: 11222333444455555666666777777888888899
 
Ответить с цитированием