高精度算法高精度运算.doc

高精度算法高精度运算.doc

ID:51134877

大小:171.00 KB

页数:8页

时间:2020-03-19

高精度算法高精度运算.doc_第1页
高精度算法高精度运算.doc_第2页
高精度算法高精度运算.doc_第3页
高精度算法高精度运算.doc_第4页
高精度算法高精度运算.doc_第5页
资源描述:

《高精度算法高精度运算.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、8/8高精度运算及其应用一、引言利用计算机进行数值运算,经常会遇到数值太大,超出Longint、int64等系统标准数据类型的有效范围,如计算mn,而m、n≤100;有时又会遇到对运算的精度要求特别高的情况,如计算圆周率π,要求精确到小数点后100位,此时real、double等数据类型也无能为力。这些情况下,我们都要用“高精度运算”来解决。高精度运算首先要解决存储问题。一般都是定义一个一维数组来存储一个高精度数,用每一个数组元素存储该数的每一位。高精度数的读入可以采用两种方法,一是采用字符串(String,AnsiStri

2、ng)方式一起读入,再逐位处理成数字存储在数组中;另一种方法是一位一位读入并存储到数组中。在实际使用时,请大家注意比较各自的优、缺点。高精度运算一般都是采用模拟的方法解决。输出时一定要注意格式和精度。二、高精度运算1、编程实现高精度加法[问题描述]输入两个正整数(最多250位),输出它们的和。比如输入:99999999999999999999999999999999999999999999999999999912345678999999999999999999999999输出:add=10000000000000000000

3、00012345678999999999999999999999998[问题分析]只要模拟“加法运算”的过程,从低位(对齐)开始逐位相加,最后再统一处理进位即可。[参考程序]Programex1(input,output);constmax=250;vars1,s2:string;a,b,c:array[1..max]ofbyte;l1,l2,l,i:integer;beginwriteln('inputtwolargeinteger:');readln(s1);readln(s2);{用字符串方式读入两个高精度数}l1:=

4、length(s1);l2:=length(s2);fori:=1tomaxdobegina[i]:=0;b[i]:=0;c[i]:=0;end;{注意一定要初始化}fori:=1tol1doa[i]:=ord(s1[l1+1-i])-48;fori:=1tol2dob[i]:=ord(s2[l2+1-i])-48;{以上是把两个高精度数逐位处理并转存到a、b两个数组中}ifl1>l2thenl:=l1elsel:=l2;fori:=1toldoc[i]:=a[i]+b[i];{对应位相加}fori:=1toldo{从低位到

5、高位,统一处理进位}ifc[i]>=10thenbeginc[i]:=c[i]-10;c[i+1]:=c[i+1]+1;end;8/8ifc[l+1]>0thenl:=l+1;write('add=');{输出}fori:=ldownto1dowrite(c[i]);readln;end.[思考和练习]1、如果要一边加一边进位,程序怎么修改?你觉得好不好?2、如果输入的数再大一点,比如1000位,还好用String类型读入吗?程序怎么修改?3、请你编写一个高精度减法的程序,注意结果的正负。2、高精度乘法例2、编程求n!的值,

6、n<1000。[问题分析]假如100!算好了(这个结果显然是一个高精度数),那么101!就只要在这个值的基础上再乘以101即可(相对于高精度数,101这个数称为单精度数),一般我们把这种高精度乘法称为“高精度数乘以单精度数”。程序如下:[参考程序]Programex2(input,output);constmax=10000;{数组的长度必须要开的足够大,为什么?}vara:array[1..max]ofinteger;{能否把integer改成byte,为什么?}n,h,i,j:integer;beginwrite(‘in

7、putn:’);readln(n);fori:=1tomaxdoa[i]:=0;{数组初始化}a[1]:=1;{1!=1}h:=1;{h表示n!的位数}fori:=2tondo{模拟乘的过程}beginforj:=1tohdoa[j]:=a[j]*i;{逐位乘}forj:=1tohdo{以下为统一处理进位}ifa[j]>=10thenbegina[j+1]:=a[j+1]+a[j]div10;{和高精度加法有何区别?}a[j]:=a[j]mod10;end;whilea[h+1]>0do{最高位的进位处理,和高精度加法有何区

8、别?}beginh:=h+1;a[h+1]:=a[h]div10;a[h]:=a[h]mod10;end;ifa[h+1]>0thenh:=h+1;end;write(n,'!=');{输出}fori:=hdownto1dowrite(a[i]);readln;end.[运行示例]8/8输

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

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

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