pascal高精度加减乘除最最最精简的程序!感激不尽

来源:百度知道 编辑:UC知道 时间:2024/07/08 15:03:14

高精度运算不仅能够扩大整数的值域,而且能够通过扩大小数的位数减低除法的精度误差,甚至还可以计算出循环节。设
设小数部分的位数上限为limit;小数部分的指针为len;st为循环节的首指针;s为小数序列,其中s[i]为第i位小数;posi为余数的位序列,其中posi[x]表示余数为x的位序号。
记下第1位的余数和小数(posi[x mod y]←1,s[1]←(x mod y)*10 div y,x←x mod y);然后按照除法的运算规则计算第2位、第3位的余数和小数¨¨。若下一位余数先前出现过(posi[x]<>0),则先前出现的位置posi[x]为循环节的开始(st←posi[x]),退出计算过程;否则依次类推,直至小数位数达到上限limit为止。
主要过程如下(不是完整的,程序头和其他的自己加上去);
fillchar(s,sizeof(s),0);{小数部分初始化}
fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}
len←0;st←0; {小数部分的指针和循环节的首指针初始化}
read(x,y);{读被除数和除数}
write(x div y);{输出整数部分}
x←x mod y;{计算x除以y的余数}
if x=0 then exit;{若x除尽y,则成功退出}
while len<limit do{若小数位未达到上限,则循环}
begin
inc(len);posi[x]←len;{记下当前位小数,计算下一位小数和余数}
x←x*10; s[len]←x div y;x←x mod y;
if posi[x]<>0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}
then begin st←posi[x]; break;end;{then}
if x=0 then break; {若除尽,则成功退出}
end;{while}

if len=0
then begin writeln;exit;end;{若小数部分的位数