第9课 高精度运算

第9课 高精度运算

ID:11481281

大小:91.50 KB

页数:24页

时间:2018-07-12

第9课 高精度运算_第1页
第9课 高精度运算_第2页
第9课 高精度运算_第3页
第9课 高精度运算_第4页
第9课 高精度运算_第5页
资源描述:

《第9课 高精度运算》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、高精度运算所谓的高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。比如:求两个200位的数的和。这时,就要用到高精度算法了。高精度运算主要解决以下三个问题:运算结果的输入和存储、运算过程、运算结果的输出【高精度加法】1、运算结果的输入和存储运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在Pascal中,能表示多个数的数据类型有两种:数组和字符串。(1)数组:每个数组元素存储1位(在优化时,这里是一个重点!),

2、有多少位就需要多少个数组元素;用数组表示数的优点:每一位都是数的形式,可以直接加减,运算时非常方便;用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不符合数值的输入习惯;(2)字符串:字符串的最大长度是255,可以表示255位。用字符串表示数的优点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算,运算时非常不方便;因此,我们可以综合起来考虑,对上面两种数据

3、结构取长补短:用字符串读入数据,用数组存储数据:vars1,s2:string;a,b,c:array[1..260]ofinteger;i,lc,k1,k2:integer;beginwrite('inputs1:');readln(s1);write('inputs2:');readln(s2);{读入两个数s1,s2,都是字符串类型}lc:=length(s1);{求出s1的长度,也即s1的位数}k1:=260;fori:=lcdownto1dobegina[k1]:=ord(s1[i])

4、-48;{将字符转成数值,ord(‘0’)的值为48}k1:=k1-1;end;k1:=k1+1;{以上将s1中的字符一位一位地转成数值并存在数组a中,低位在后(从第260位开始),高位在前(每存完一位,k1减1)}对s2的转化过程和上面一模一样。lc:=length(s2);{求出s2的长度,也即s2的位数}k2:=260;fori:=lcdownto1dobegina[k2]:=ord(s2[i])-48;{将字符转成数值,ord(‘0’)的值为48}k2:=k2-1;end;k2:=k2+

5、1;2、运算过程在往下看之前,大家先列竖式计算35+86。注意的问题:(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;(2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助MOD、DIV运算完成这一步;(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;(4)如果两个加数位数不一样多,则按位数多的一个进行计算;ifk1>k2{k1和k2

6、分别是最高位的下标,所以小的应该更长}thenk:=k2elsek:=k1;y:=0;fori:=260downtokdobeginx:=a[i]+b[i]+y;c[i]:=xmod10;{计算当前位上的数}y:=xdiv10;{计算进位}end;ify<>0{判断最后有没有进位}thenbegink:=k-1;c[k]:=y;end;3、结果的输出(这也是优化的一个重点)按运算结果的实际位数输出fori:=kto260dowrite(c[i]);writeln;u求两个数的加法的完整程序:pr

7、ogramsum;vars1,s2:string;a,b,c:array[1..260]ofinteger;i,lc,k1,k2,x,y:integer;beginwrite('inputs1:');readln(s1);write('inputs2:');readln(s2);lc:=length(s1);k1:=260;fori:=lcdownto1dobegina[k1]:=ord(s1[i])-48;k1:=k1-1;end;k1:=k1+1;lc:=length(s2);k2:=260

8、;fori:=lcdownto1dobeginb[k2]:=ord(s2[i])-48;k2:=k2-1;end;k2:=k2+1;ifk1>k2thenk:=k2elsek:=k1;y:=0;fori:=260downtokdobeginx:=a[i]+b[i]+y;c[i]:=xmod10;y:=xdiv10;end;ify<>0thenbegink:=k-1;c[k]:=y;end;fori:=kto260dowrite(c[i]);writeln;end.²优化:以上的方法有明显的缺点:

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。