【原创】Pascal高精度减法

先来看一下什么是高精度算法:

高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。此处我们主要讲解高精度减法。

如何从读入的算式中提取减数和被减数:

先介绍一下高精度减法的实现过程:先读入一个算式,提取出里面的被减数和减数,我们可以通过Copy函数来实现。

具体代码如下:

Readln(Suanshi);
Len:=Length(Suanshi);
For i:=1 to length(Suanshi) Do
Begin
IF Suanshi[i]='-' Then
Begin
x:=Copy(Suanshi,Tmp,i-tmp);
Tmp:=i+1;
y:=Copy(Suanshi,Tmp,len-tmp+1);

Break;
End;

这里很简单,不需要多说。

如何将字符串转换为整数数组?

要想将字符串转换为整数数组,只需要一个For循环就可以解决了,先获得String的长度,然后循环就OK了。(注意:因为我们的减法运算是从右到左的,所以要把转换过程稍微改一下)

具体代码如下:

For i:=1 to Length(x) do
a[i]:=ord(x[length(x)-i+1])-ord('0');

怎么样?很短吧!

如何判断两个数的大小?

由于该问题比较简单,不做详细介绍,只要用补零法,然后判断即可。

给个补零的函数:

Function BuLing(a,b:String):String;
Var i:Longint;
Begin
While length(a)<>Length(b) Do Insert('0',a,1);
Buling:=a
End;

在运算时,如何处理借位问题?

只需要判断a[i]是否小于b[i]如果小于的话,Dec(a[i+1]),a[i]+10,然后再减b[i]即可。

代码比较简单,请大家自己发挥。

至于那些比较简单的,如输入输出,就不再讲了,注意:输出时要注意判断最高位是不是0,然后在输出。

下面给出所有的代码,如有不足之处,请指出:

Program Jianfa;
Type ArryType=Array[1..10000] of Integer;
Var x,y,Suanshi:String;
Var Flag:Char;
Var a,b:array[1..10000] of Integer;
Var i,j,len,k,tmp:Longint;
Function BuLing(a,b:String):String;
Var i:Longint;
Begin
While length(a)<>Length(b) Do Insert('0',a,1);
Buling:=a
End;
Begin
Fillchar(a,sizeof(a),0);
Fillchar(b,sizeof(b),0);
Flag:='+';
Tmp:=1;
Readln(Suanshi);
Len:=Length(Suanshi);
For i:=1 to length(Suanshi) Do
Begin
IF Suanshi[i]='-' Then
Begin
x:=Copy(Suanshi,Tmp,i-tmp);
Tmp:=i+1;
y:=Copy(Suanshi,Tmp,len-tmp+1);
End;
End;
IF Length(x)<Length(y) Then x:=BuLing(x,y)
Else y:=Buling(y,x);
For i:=1 to Len do
IF x[i]<y[i] Then
Begin
Flag:='-';
Break;
End
Else Break;
IF Flag='+' Then
Begin
For i:=1 to Length(x) do
a[i]:=ord(x[length(x)-i+1])-ord('0');
For i:=1 to Length(y) do
b[i]:=ord(y[length(y)-i+1])-ord('0');
End
Else
Begin
For i:=1 to Length(y) do
a[i]:=ord(y[length(y)-i+1])-ord('0');
For i:=1 to Length(x) do
b[i]:=ord(x[length(x)-i+1])-ord('0');
End;
IF Length(x)<Length(y) Then
Len:=Length(y)
Else
Len:=Length(x);
For i:=1 to len do
Begin
IF a[i]<b[i] Then
Begin
Dec(a[i+1]);
a[i]:=a[i]+10;
End;
a[i]:=a[i]-b[i];
End;
While a[len]=0 Do Dec(Len);
Write(Flag);
For i:=len downto 1 do Write(a[i]);
Readln;
End.

posted @ 2011-07-27 13:56  SkyZone_H  阅读(1602)  评论(1编辑  收藏  举报