0

我需要使用设置的精度(浮点后最多 50 个符号)计算大数的平方根(最多 10^100)。为了这个目标,我决定使用逐位计算方法。但是当我在 Delphi 7 上实现它时,我遇到了很多麻烦并且对我的代码感到困惑。你能展示一下你将如何实现这个任务吗?谢谢这里是我的代码

program sqrtCalc;

{$APPTYPE CONSOLE}
{$Q+}  {$R+}

uses
  SysUtils,math;

const
  signCount=50; 

var
  inputString:String;
  root:String;
  intString,realString:String;
  intArray,realArray:array of Integer;
  intRootArray,realRootArray:Integer;
  i,j,dotPosition:Integer;
  a,b,c,d:Integer;

Procedure input();
  begin
    WriteLn('x=');
    try
      readln(inputString)
    except
      Writeln('Invalid input data, please try again');
      input(); 
    end;
  end;

begin
  input();
  dotPosition:=pos('.',inputString);
  if dotPosition<>0 then
  begin
    realString:=copy(inputString,dotPosition+1,Length(inputString)-1);
    intString:=copy(inputString,0,dotPosition-1);
    if odd(Length(realString)) then Insert('0',realString,Length(realString)+1);
    i:=1;
    while i<Length(realString) do
    begin
      SetLength(realArray,length(realArray)+1);
      realArray[length(realArray)-1]:=StrToInt(copy(realString,i,2));
      i:=i+2;
     end;
  end
  else
    intString:=inputString;

  if odd(Length(intString)) then Insert('0',intString,1);

  i:=1;
  while i<Length(intString) do
  begin
    SetLength(intArray,length(intArray)+1);
    intArray[length(intArray)-1]:=StrToInt(copy(intString,i,2));
    i:=i+2;
  end;


  //Here must be implementation of mathematic actions
 //But i got confused
  a:=trunc(sqrt(intArray[0])); root:=IntToStr(a);
  b:=intArray[0]-a*a;

  c:=StrToInt(root)*20;
  d:=

  Write(b);
  Readln;
end.
4

1 回答 1

3

使用大整数算术而不是字符串,无论是我的TForge还是 Alex Ciobanu 的DeHL

如果需要小数点后 50 位,则参数应乘以 10^100(指数值应为偶数)以使用大基数类型。

您需要在字符串表示中将小数点向右移动 100 位,将获得的字符串的整数部分转换为大基数,使用二进制算法从大基数中提取平方根,将根转换为字符串并将小数点向左移动 50 位得到最终结果。

于 2012-12-06T05:52:04.437 回答