当前位置:首页 > 网络编程 > 软件语言 > DELPHI > “无限”位四则运算

“无限”位四则运算

点击次数:50 次 发布日期:2008-11-09 08:46:40 作者:源代码网
源代码网推荐
广告载入中

源代码网整理以下由于标准的数字变量类型取值有限,如果需要进行运算的数字超过了范围,用标准的数字变量类型就显得无能为力了!下面的四个函数利用Delphi中的字符串对象实现了大数运算。

源代码网整理以下加法、乘法由zswang编写

源代码网整理以下function StrLeft(const mStr: string; mDelimiter: string): string;
begin
  Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }

源代码网整理以下function StrRight(const mStr: string; mDelimiter: string): string;
begin
  if Pos(mDelimiter, mStr) <= 0 then
    Result := ´´
  else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }

软件开发网 www.mscto.com

源代码网整理以下function formatnum(mNumber: string):string;
var
  m:integer;
  TemStr:string;
begin
  Result:=´´;
  for m:=1 to Length(mNumber) do
  begin
    if mNumber[m]=´.´ then
      Result:=Result+´.´
    else
      Result:=Result+IntToStr(StrToIntDef(mNumber[m], 0));
  end;
  while Pos(´0´, Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
  if Pos(´.´, Result )<= 0 then Result := Result + ´.´; //没有有小数点补小数点
  TemStr:=StrRight(Result,´.´);
  while Copy(TemStr, Length(TemStr), 1) = ´0´ do Delete(TemStr, Length(TemStr), 1); //排除小数后无效的0
  Result:=StrLeft(Result,´.´)+´.´+TemStr;
  if Copy(Result, Length(Result), 1) = ´.´ then Delete(Result, Length(Result), 1); //排除无效小数点


  if Copy(Result, 1, 1)=´.´ then Result:=´0´+Result;
  if (Result = ´´) then Result := ´0´;
end;

源代码网整理以下function InfiniteAdd(mNumberA, mNumberB: string): string; { 无限位数加法 }
var
  I: Integer;
  T: Integer;
begin
  Result := ´´;
  if Pos(´.´, mNumberA) <= 0 then mNumberA := mNumberA + ´.´; //没有有小数点补小数点
  if Pos(´.´, mNumberB) <= 0 then mNumberB := mNumberB + ´.´; //没有有小数点补小数点
  I := Max(Length(StrLeft(mNumberA, ´.´)), Length(StrLeft(mNumberB, ´.´))); //整数部分最大长度
  mNumberA := DupeString(´0´, I - Length(StrLeft(mNumberA, ´.´))) + mNumberA; //整数前补0
  mNumberB := DupeString(´0´, I - Length(StrLeft(mNumberB, ´.´))) + mNumberB; //整数前补0
  T := Max(Length(StrRight(mNumberA, ´.´)), Length(StrRight(mNumberB, ´.´))); //小数部分最大长度
  mNumberA := mNumberA + DupeString(´0´, T - Length(StrRight(mNumberA, ´.´))); //小数后补0


  mNumberB := mNumberB + DupeString(´0´, T - Length(StrRight(mNumberB, ´.´))); //小数后补0
  I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度
  T := 0; //进位数初始化
  for I := I downto 1 do //从后向前扫描
    if [mNumberA[I], mNumberB[I]] <> [´.´] then begin //不是小数点时
      T := StrToIntDef(mNumberA[I], 0) + T; //累加当前数位
      T := StrToIntDef(mNumberB[I], 0) + T; //累加当前数位
      Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
      T := T div 10; //计算进位数
    end else Result := ´.´ + Result; //加上小数点
  if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
  while Pos(´0´, Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
  while Copy(Result, Length(Result), 1) = ´0´ do
    Delete(Result, Length(Result), 1); //排除小数后无效的0
  if Copy(Result, Length(Result), 1) = ´.´ then
    Delete(Result, Length(Result), 1); //排除无效小数点
  if Copy(Result, 1, 1) = ´.´ then Result := ´0´ + Result; //处理无0小数情况
  if (Result = ´´) then Result := ´0´; //处理空字符情况
end; { InfiniteAdd } 软件开发网 www.mscto.com

源代码网整理以下function InfiniteMult(mNumberA, mNumberB: string): string; { 无限位数乘法 }

源代码网整理以下  function fMult(mNumber: string; mByte: Byte): string; { 无限位数乘法子函数 }
  var
    I: Integer;
    T: Integer;
  begin
    Result := ´´;
    T := 0;
    for I := Length(mNumber) downto 1 do begin //从后向前扫描
      T := StrToIntDef(mNumber[I], 0) * mByte + T; //累加当前数位
      Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
      T := T div 10; //计算进位数
    end;
    if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
  end; { fMult }

源代码网整理以下var
  I: Integer;
  vDecimal: Integer; //小数位数
  T: string;
begin
  Result := ´´;
  ///////Begin 处理小数
  if Pos(´.´, mNumberA) <= 0 then mNumberA := mNumberA + ´.´; //没有有小数点补小数点
  if Pos(´.´, mNumberB) <= 0 then mNumberB := mNumberB + ´.´; //没有有小数点补小数点
  vDecimal := Length(StrRight(mNumberA, ´.´)) + Length(StrRight(mNumberB, ´.´)); //计算小数位数
  mNumberA := StrLeft(mNumberA, ´.´) + StrRight(mNumberA, ´.´); //删除小数点
  mNumberB := StrLeft(mNumberB, ´.´) + StrRight(mNumberB, ´.´); //删除小数点
  ///////End 处理小数
  T := ´´;
  for I := Length(mNumberB) downto 1 do begin
    Result := InfiniteAdd(Result, fMult(mNumberA, StrToIntDef(mNumberB[I], 0)) + T);
    T := T + ´0´;
  end;
  Insert(´.´, Result, Length(Result) - vDecimal + 1);
  while Pos(´0´, Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
  while Copy(Result, Length(Result), 1) = ´0´ do
    Delete(Result, Length(Result), 1); //排除小数后无效的0
  if Copy(Result, Length(Result), 1) = ´.´ then
    Delete(Result, Length(Result), 1); //排除无效小数点
  if Copy(Result, 1, 1) = ´.´ then Result := ´0´ + Result; //处理无0小数情况
  if (Result = ´´) then Result := ´0´; //处理空字符情况
end; { InfiniteMult }

源代码网整理以下function InfiniteSub(mNumberA, mNumberB: string): string; { 无限位数减法 }
var
  I: Integer;
  T: Integer;
  TemNumA:String;
  minus:Boolean;
begin
  Result := ´´;
  mNumberA:=formatnum(mNumberA);
  mNumberB:=formatnum(mNumberB);
  if Pos(´.´, mNumberA) <= 0 then mNumberA := mNumberA + ´.´; //没有有小数点补小数点
  if Pos(´.´, mNumberB) <= 0 then mNumberB := mNumberB + ´.´; //没有有小数点补小数点
  I := Max(Length(StrLeft(mNumberA, ´.´)), Length(StrLeft(mNumberB, ´.´))); //整数部分最大长度
  mNumberA := DupeString(´0´, I - Length(StrLeft(mNumberA, ´.´))) + mNumberA; //整数前补0
  mNumberB := DupeString(´0´, I - Length(StrLeft(mNumberB, ´.´))) + mNumberB; //整数前补0
  T := Max(Length(StrRight(mNumberA, ´.´)), Length(StrRight(mNumberB, ´.´))); //小数部分最大长度


  if ((Length(StrLeft(mNumberA, ´.´))) > (Length(StrLeft(mNumberB, ´.´)))) or(((Length(StrLeft(mNumberA, ´.´))) = (Length(StrLeft(mNumberB, ´.´))))and(mNumberB>mNumberA))then
  begin
    TemNumA := mNumberA;
    mNumberA := mNumberB + DupeString(´0´, T - Length(StrRight(mNumberB, ´.´))); //小数后补0
    mNumberB := TemNumA + DupeString(´0´, T - Length(StrRight(TemNumA, ´.´))); //小数后补0
    minus:=True;
  end
  else
  begin
    mNumberA := mNumberA + DupeString(´0´, T - Length(StrRight(mNumberA, ´.´))); //小数后补0
    mNumberB := mNumberB + DupeString(´0´, T - Length(StrRight(mNumberB, ´.´))); //小数后补0
    minus:=False;
  end;
  I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度
  T := 0; //进位数初始化
  for I := I downto 1 do //从后向前扫描
    if [mNumberA[I], mNumberB[I]] <> [´.´] then begin //不是小数点时
      T := StrToIntDef(mNumberB[I], 0) - T; //累加当前数位
      T := StrToIntDef(mNumberA[I], 0) - T; //累加当前数位
      if (T<0) and (I<>1) then
      begin
        T:=T+10;
        Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
        T := -1; //计算进位数
      end
      else
      begin
        Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
        T := T div 10; //计算进位数

源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华