高精度运算及其应用

高精度运算及其应用

ID:6416080

大小:178.00 KB

页数:13页

时间:2018-01-13

高精度运算及其应用_第1页
高精度运算及其应用_第2页
高精度运算及其应用_第3页
高精度运算及其应用_第4页
高精度运算及其应用_第5页
资源描述:

《高精度运算及其应用》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、Jsoi2010春季函授讲义(B2)13/13高精度运算及其应用一、引言利用计算机进行数值运算,经常会遇到数值太大,超出Longint、int64等系统标准数据类型的有效范围,如计算mn,而m、n≤100;有时又会遇到对运算的精度要求特别高的情况,如计算圆周率π,要求精确到小数点后100位,此时real、double等数据类型也无能为力。这些情况下,我们都要用“高精度运算”来解决。一般我们将小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字统称为高精度数。高精度运算首先要解决存储问题。一般都是定义一个一维

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

3、9999999999999999999912345678999999999999999999999999输出:add=1000000000000000000000012345678999999999999999999999998[问题分析]只要模拟“加法运算”的过程,从低位(对齐)开始逐位相加,最后再统一处理进位即可。[参考程序]Programex1(input,output);constmax=250;vars1,s2:string;a,b,c:array[1..max]ofbyte;l1,l2,l,i:in

4、teger;beginwriteln('inputtwolargeinteger:');readln(s1);readln(s2);{用字符串方式读入两个高精度数}l1:=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:=1tol2doJsoi2010春季函授讲义(B2)13/13b[i]:=ord(s2[l2

5、+1-i])-48;{以上是把两个高精度数逐位处理并转存到a、b两个数组中}ifl1>l2thenl:=l1elsel:=l2;fori:=1toldoc[i]:=a[i]+b[i];{对应位相加}fori:=1toldo{从低位到高位,统一处理进位}ifc[i]>=10thenbeginc[i]:=c[i]-10;c[i+1]:=c[i+1]+1;end;ifc[l+1]>0thenl:=l+1;write('add=');{输出}fori:=ldownto1dowrite(c[i]);readln;end.

6、[思考和练习]1、如果要一边加一边进位,程序怎么修改?你觉得好不好?2、如果输入的数再大一点,比如1000位,还好用String类型读入吗?程序怎么修改?3、请你编写一个高精度减法的程序,注意结果的正负。2、高精度乘法例2、编程求n!的值,n<1000。说明:n!表示1*2*3*…*n,例如3!=1*2*3,5!=1*2*3*4*5[问题分析]假如100!算好了(这个结果显然是一个高精度数),那么101!就只要在这个值的基础上再乘以101即可(相对于高精度数,101这个数称为单精度数),一般我们把这种高精度乘法

7、称为“高精度数乘以单精度数”。程序如下:[参考程序]Programex2(input,output);constmax=10000;{数组的长度必须要开的足够大,为什么?}vara:array[1..max]ofinteger;{能否把integer改成byte,为什么?}n,h,i,j:integer;beginwrite(‘inputn:’);readln(n);fori:=1tomaxdoa[i]:=0;{数组初始化}a[1]:=1;{1!=1}h:=1;{h表示n!的位数}fori:=2tondo{模拟

8、乘的过程}beginJsoi2010春季函授讲义(B2)13/13forj:=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{最高位的进位处理,和高精度加法

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

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

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