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