Pascal高精度加法

减小字体 增大字体 作者:佚名  来源:转载  发布时间:2011-08-04 21:42:32

先来看一下什么是高精度算法:
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。此处我们主要讲解高精度减法。
如何从读入的算式中提取减数和被减数:
先介绍一下高精度减法的实现过程:先读入一个算式,提取出里面的被减数和减数,我们可以通过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;
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.

本文来自:http://www.cnblogs.com/SkyZone-H/archive/2011/07/27/2118292.html

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

广告位置B