Извлечение точного квадратного корня из n-разрядного числа - Pascal ABC
Формулировка задачи:
Составить программу извлечения точного квадратного корня из n-разрядного числа (n > 40)
Решение задачи: «Извлечение точного квадратного корня из n-разрядного числа»
textual
Листинг программы
function df0(a:string):string;
var
r:string;
begin
r:=a;
while (length(r)>1) and (r[1]='0') do delete(r,1,1);
df0:=r;
end;
function dl0(a:string):string;
var
r:string;
begin
r:=a;
while (length(r)>1) and (r[length(r)]='0') do delete(r,length(r),1);
if r[length(r)]='.' then delete(r,length(r),1);
dl0:=r;
end;
function Mult(s:string;n:integer):string;
var
i,j,k:integer;
r:string;
begin
r:='';k:=0;
for i:=length(s) downto 1 do begin
j:=(ord(s[i])-48)*n+k;
k:=j div 10;j:=j mod 10;
r:=inttostr(j)+r;
end;
if k>0 then r:=chr(k+48)+r;
Mult:=r;
end;
function Srav(a,b:string):boolean;
var
i:longint;
r:boolean;
begin
r:=true;
if length(a)<length(b) then r:=false else
if length(a)=length(b) then for i:=1 to length(a) do if a[i]>b[i] then break else if a[i]<b[i] then begin r:=false;break;end;
Srav:=r;
end;
function Minus(a,b:string):string;
var
i,j,k,l,z:integer;
r,m:string;
begin
m:='';
a:=df0(a);b:=df0(b);
if not Srav(a,b) then begin m:='-';r:=a;a:=b;b:=r;end;
r:='';
j:=length(b);i:=length(a);
while j>0 do begin
k:=ord(b[j])-48;
l:=ord(a[i])-48;
if k>l then begin z:=i-1;while a[z]='0' do begin a[z]:='9';z:=z-1;end;a[z]:=chr(ord(a[z])-1);l:=10+l;end;
r:=inttostr(l-k)+r;
j:=j-1;i:=i-1;
end;
r:=df0(copy(a,1,i)+r);
Minus:=m+r;
end;
function LargeSqrt(n:string;t:longint):string;
var
s,b,c,d,r:string;
i,j,k,l,m,p:longint;
a:array[1..2000] of string[2];
begin
if length(n)>4000 then writeln('Слишком длинное число!') else begin
j:=1;
s:=n;
while length(s)>1 do begin
a[j]:=copy(s,length(s)-1,2);
delete(s,length(s)-1,2);
j:=j+1;
end;
if s<>'' then a[j]:=s else j:=j-1;
m:=strtoint(a[j]);l:=trunc(sqrt(m));
s:=inttostr(l);
b:=inttostr(m-l*l);
repeat
c:=s;
j:=j-1;
if j>0 then b:=b+a[j] else begin if p=0 then p:=length(s);b:=b+'00';t:=t-1;end;
b:=df0(b);
if b<>'0' then begin
c:=Mult(c,2);
i:=9;
d:=Mult(c+chr(i+48),i);
while (Srav(d,b) and (d<>b) and (i>0)) do begin i:=i-1;d:=Mult(c+chr(i+48),i);end;
b:=Minus(b,d);
end else i:=0;
s:=s+chr(i+48);
until (t=0);
insert('.',s,p+1);
r:=s;
LargeSqrt:=dl0(r);
end;
end;
var n:string;
begin
write('n=');
readln(n);
writeln('sqrt(',n,')=',LargeSqrt(n,40));//LargeSqrt(число, количество знаков после запятой);
end.
Объяснение кода листинга программы
- Функция df0(a:string):string предназначена для извлечения точного квадратного корня из строки a. Она удаляет все нули в начале строки.
- Функция dl0(a:string):string предназначена для извлечения точного квадратного корня из строки a. Она удаляет все нули в конце строки.
- Функция Mult(s:string;n:integer):string вычисляет результат умножения строки s на n.
- Функция Srav(a,b:string):boolean определяет, являются ли две строки равными или одна из них является подстрокой другой.
- Функция Minus(a,b:string):string вычисляет разность между двумя строками.
- Функция LargeSqrt(n:string;t:longint):string предназначена для вычисления точного квадратного корня из строки n. Она использует вложенные циклы для разделения строки на подстроки и вычисления корня каждой подстроки.
- В функции LargeSqrt используется массив a[1..2000] of string[2], чтобы хранить подстроки строки n.
- В конце функции LargeSqrt вставляется точка с запятой и пробел, чтобы получить правильный формат вывода.