西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → Pascal高精度减法 什么是高精度算法?

Pascal高精度减法 什么是高精度算法?

相关软件相关文章发表评论 来源:西西整理时间:2011/7/27 22:29:26字体大小:A-A+

作者:西西点击:93次评论:0次标签: Pascal

CP Pascal EditorV3.50 简体中文绿色版
  • 类型:编程工具大小:2.8M语言:中文 评分:5.8
  • 标签:
立即下载
先来看一下什么是高精度算法:
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称谓是高精度数。高精度算法就是能处理高精度数各种运算的算法。此处我们主要讲解高精度减法。

如何从读入的算式中提取减数和被减数:
先介绍一下高精度减法的实现过程:先读入一个算式,提取出里面的被减数和减数,我们可以通过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.
PS:下面的隐藏内容,想看的就看(选中即可)

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)