Pascal:длинная арифметика
Версия от 12:28, 21 февраля 2010; Den (обсуждение | вклад)
Длинная арифметика
Содержание
[убрать]Длинная арифметика
Длинная арифметика - раздел программирования позволяющий удобно работать с числами которые не могут быть помещены в стандартные типы языка. Ниже представлен код программы реализующий сложение двух чисел, длина которых ограничивается только оперативной памятью.
А+В
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.
На основе этих программ могут быть созданы программы нахождения факториала, возведения в степень и т.д. позводяющие работать с большими числами.