Извлечение точного квадратного корня из 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.

Объяснение кода листинга программы

  1. Функция df0(a:string):string предназначена для извлечения точного квадратного корня из строки a. Она удаляет все нули в начале строки.
  2. Функция dl0(a:string):string предназначена для извлечения точного квадратного корня из строки a. Она удаляет все нули в конце строки.
  3. Функция Mult(s:string;n:integer):string вычисляет результат умножения строки s на n.
  4. Функция Srav(a,b:string):boolean определяет, являются ли две строки равными или одна из них является подстрокой другой.
  5. Функция Minus(a,b:string):string вычисляет разность между двумя строками.
  6. Функция LargeSqrt(n:string;t:longint):string предназначена для вычисления точного квадратного корня из строки n. Она использует вложенные циклы для разделения строки на подстроки и вычисления корня каждой подстроки.
  7. В функции LargeSqrt используется массив a[1..2000] of string[2], чтобы хранить подстроки строки n.
  8. В конце функции LargeSqrt вставляется точка с запятой и пробел, чтобы получить правильный формат вывода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.571 из 5
Похожие ответы