0

設定された精度 (浮動小数点の後に最大 50 符号) で大きな数値 (最大 10^100) の平方根を計算する必要があります。この目標のために、私は桁ごとの計算方法を使用することにしました。しかし、Delphi 7 に実装すると、多くの問題が発生し、コードが混乱してしまいました。このタスクをどのように実装するかを示していただけますか。ありがとうございます ismyコード

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 に答える