Извлечение точного квадратного корня из 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 вставляется точка с запятой и пробел, чтобы получить правильный формат вывода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д