“无限”位四则运算[2]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 ehom 的 blog

  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; //计算进位数
      end;
    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'; //处理空字符情况
  if minus then result:='-'+result;
end; { infinitesub}

function infinitediv(mnumbera, mnumberb: string;n:integer): string; { 无限位数除法 }
//n为有效数字个数

 function vdecimal(mnumber: string):integer;
 var m,x:integer;
 begin
   x:=0;
   if pos('.', mnumber) <= 0 then
   begin
     for m:=length(mnumber) downto 1 do
     begin
       if mnumber[m]='0' then x:=x+1 else break;
     end;
     result:=-x;
   end
   else
     result:=length(strright(mnumber, '.'));
 end;

 function formatnum2(mnumber: string):string;
 begin
   result:=mnumber;
   if pos('.', result )<= 0 then result := result + '.';

本文关键:四则运算
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top