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

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

本文简介:选择自 ehom 的 blog

由于标准的数字变量类型取值有限,如果需要进行运算的数字超过了范围,用标准的数字变量类型就显得无能为力了!下面的四个函数利用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 }

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 }

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 := '';

本文关键:四则运算
 

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

go top