Программирование на языке Pascal - ФОРУМ

Объявление

Продолжается конкурс на "Самый прикоьный юзербар" Голосовать и просматривать голоса других вы можете в форуме События, раздел "Голосование"

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование на языке Pascal - ФОРУМ » Теория » Длинная арифметика


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

Сообщений 1 страница 7 из 7

1

Все  что связано с ней здесь!

0

2

Сумма

Код:
const base=1000;  {основание}

var a,b,c:array[0..10000] of integer;      //Массивы где хранятся числа (по 3 цифры в ячейке)

procedure redln(var a:array of integer);    //Процедура чтения чисел
var ch:char; i:integer;
begin
   fillchar(a,sizeof(a),0);
    repeat read(ch);
    until ch in ['0'..'9'];

    while ch in ['0'..'9'] do
    begin
       for i:=a[0] downto 1 do
       begin
          a[i+1]:=a[i+1]+(a[i]*10) div base;
          a[i]:=(a[i]*10) mod base;
       end;
       a[1]:=a[1]+ord(ch)-48;
       if a[a[0]+1]>0 then inc(a[0]);
       read(ch);
    end;
end;

procedure wrt(a:array of integer);  //Процедура вывода ответа
var s:string;  i:integer;
begin
   write (a[a[0]]);
   for i:=a[0]-1 downto 1 do
   begin
      str(a[i],s);
      while length(s)<3 do s:='0'+s;
      write(s);
   end;
   writeln;
end;

procedure sum(a,b:array of integer; var c:array of integer);  //сама сумма
var i,k:integer;
begin
   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 base;
       c[i]:=(c[i]+a[i]+b[i]) mod base;
    end;
    if c[k+1]=0 then c[0]:=k  else c[0]:=k+1;
end;

begin
   redln(a);
   redln(b);
   sum(a,b,c);
   wrt(c);
end.

0

3

Вооот моя прога для сложение двух больших чисел ну скажем 254 значное число а если точнее это будет         10 ^ 253 значное чило почему так а ? а потому что на экран можно максимум 255 символов на одну строку вот ну конечно можно было через файлы побольше сделать но так нормально тоже вот
а еще два числа неотрицательные

Код:
Uses Crt;

{$M 65520,0,655360}

type  Myarray = array [0..254] of integer;

var   a,b,c : Myarray;

procedure To_Read(var a:Myarray);

var   ch : char;
        i  : integer;

procedure swap(var x,y:integer);

var   z : integer;

begin
 z := x;
 x := y;
 y := z;
end;

begin
 write(' ');
 a[0] := 0;
 while NOT EOLN do
 begin
  read(ch);
  if NOT (ch in ['0'..'9']) then
   break;
  a[0] := a[0]+1;
  a[a[0]] := ord(ch)-ord('0');   
 end;
 readln;
 for i := 1 to (a[0] div 2) do
  swap(a[i],a[a[0]-i+1]);
end;

function max(a,b:integer) : integer;

begin
 if a > b then
  max := a
 else
  max := b;
end;

procedure Sum(a,b:Myarray;var c:Myarray);

var   i,r : integer;

begin
 c[0] := max(a[0],b[0]);
 r := 0;
 for i := 1 to c[0] do
 begin
  c[i] := a[i]+b[i]+r;
  r := c[i] div 10;
  c[i] := c[i] mod 10;
 end;
 if r > 0  then
 begin
  c[0] := c[0]+1;
  c[c[0]] := r;
 end;
end;

procedure To_Write(c:Myarray);

var   i : integer;

begin
 if max(a[0],b[0]) < c[0] then
  write('-')
 else
  write(' ');
 for i := 1 to c[0] do
  write('-');
 writeln;
 if max(a[0],b[0]) = c[0] then
  write(' ');
 for i := c[0] downto 1 do
  write(c[i]);
 readln;
end;

begin
 CLRSCR;
 TextColor(Green);
 writeln;
 writeln('Vidite dva chisla cherez perevod stroki tochnee 1-oe zatem ENTER zatem 2-chislo');
 writeln;
(*========================================================================================*)
 To_Read(a);
 writeln('+');
 To_Read(b);
(*========================================================================================*)
 Sum(a,b,c);
 To_Write(c);
end.

Отредактировано Oddi (07-04-2008 13:09:36)

+1

4

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

Код:
Uses Crt;

{$M 65520,0,655360}

type  Myarray = array [0..254] of integer;

var   a,b,c : Myarray;

procedure To_Read(var a:Myarray);

var   ch : char;
      i  : integer;

procedure swap(var x,y:integer);

var   z : integer;

begin
 z := x;
 x := y;
 y := z;
end;

begin
 write(' ');
 a[0] := 0;
 while NOT EOLN do
 begin
  read(ch);
  if NOT (ch in ['0'..'9']) then
   break;
  a[0] := a[0]+1;
  a[a[0]] := ord(ch)-ord('0');   
 end;
 readln;
 for i := 1 to (a[0] div 2) do
  swap(a[i],a[a[0]-i+1]);
end;

function max(a,b:integer) : integer;

begin
 if a > b then
  max := a
 else
  max := b;
end;

procedure Minus(a,b:Myarray;var c:Myarray);

var   i : integer;

begin
 c[0] := max(a[0],b[0]);
 for i := 1 to c[0] do
 begin
  c[i] := a[i]-b[i];
  if c[i] < 0 then
  begin
   c[i] := c[i]+10;
   a[i+1] := a[i+1]-1;
  end; 
 end;
 while (c[0] > 1) and (c[c[0]] = 0) do
  c[0] := c[0]-1;
end;

procedure To_Write(c:Myarray);

var   i : integer;

begin
 write(' ');
 for i := 1 to c[0] do
  write('-');
 writeln;
 for i := 1 to abs(c[0]-max(a[0],b[0]))+1 do
  write(' ');
 for i := c[0] downto 1 do
  write(c[i]);
 readln;
end;

begin
 CLRSCR;
 TextColor(Green);
 writeln;
 writeln('Vidite dva chisla cherez perevod stroki tochnee 1-oe zatem ENTER zatem 2-chislo');
 writeln;
(*========================================================================================*)
 To_Read(a);
 writeln('-');
 To_Read(b);
(*========================================================================================*)
 Minus(a,b,c);
 To_Write(c);
end.

Отредактировано Oddi (07-04-2008 13:10:40)

+1

5

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

Код:
Uses Crt;

{$M 65520,0,655360}

type  Myarray = array [0..254] of integer;

var   a,b,c : Myarray;

procedure To_Read(var a:Myarray);

var   ch : char;
      i  : integer;

procedure swap(var x,y:integer);

var   z : integer;

begin
 z := x;
 x := y;
 y := z;
end;

begin
 write(' ');
 a[0] := 0;
 while NOT EOLN do
 begin
  read(ch);
  if NOT (ch in ['0'..'9']) then
   break;
  a[0] := a[0]+1;
  a[a[0]] := ord(ch)-ord('0');   
 end;
 readln;
 for i := 1 to (a[0] div 2) do
  swap(a[i],a[a[0]-i+1]);
end;

function Compare(a,b:Myarray) : integer;

var   i : integer;

begin
 if a[0] > b[0] then
 begin
  Compare := 1;
  exit;
 end;
 if a[0] < b[0] then
 begin
  Compare := 2;
  exit;
 end;
 for i := a[0] downto 1 do
 begin
  if a[i] > b[i] then
  begin
   Compare := 1;
   exit;
  end;
  if a[i] < b[i] then
  begin
   Compare := 2;
   exit;
  end;
 end;
 Compare := 0;
end;


begin
 CLRSCR;
 TextColor(Green);
 writeln;
 writeln('Vidite dva chisla cherez perevod stroki tochnee 1-oe zatem ENTER zatem 2-chislo');
 writeln;
(*========================================================================================*)
 To_Read(a);
 writeln;
 writeln('<>');
 writeln;
 To_Read(b);
(*========================================================================================*)
 writeln;
 Case Compare(a,b) of
  0 : write(' ='); (* ONI ravni *)
  1 : write(' >'); (* pervoe bol'she *)
  2 : write(' <'); (* vtoroe bol'she *)
 end;
 readln;
end.

0

6

Где-то мне попадалась рекомендация использовать для таких чисел тип Double.
245 знака в него по моему влезет.

0

7

неа в Доубль стока не влезет, да и не обязательно ж 254, можно и больше тот массив сделать)

0


Вы здесь » Программирование на языке Pascal - ФОРУМ » Теория » Длинная арифметика


Рейтинг форумов | Создать форум бесплатно