pascal语言 高精度计算

上传人:飞*** 文档编号:57087933 上传时间:2018-10-18 格式:PPT 页数:16 大小:198.50KB
返回 下载 相关 举报
pascal语言 高精度计算_第1页
第1页 / 共16页
pascal语言 高精度计算_第2页
第2页 / 共16页
pascal语言 高精度计算_第3页
第3页 / 共16页
pascal语言 高精度计算_第4页
第4页 / 共16页
pascal语言 高精度计算_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《pascal语言 高精度计算》由会员分享,可在线阅读,更多相关《pascal语言 高精度计算(16页珍藏版)》请在金锄头文库上搜索。

1、第一章 高精度计算,利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。介绍常用的几种高精度计算的方法。高精度计算中需要处理好以下几个问题: (1)数据的接收方法和存贮方法数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。另一种方法是直接用循环加数组方法输入数据。 (2) 高精度数位数的确定位数的确定:接收时往往是用字符串的

2、,所以它的位数就等于字符串的长度。 (3) 进位,借位处理加法进位:Ci:= Ai+Bi;if Ci=10 then begin Ci:= Ci mod 10; Ci+1:= Ci+1+1 end;减法借位:if aibi then begin ai+1:=ai+1-1; ai:=ai+10 end;ci:=ai-bi;乘法进位:ci+j-1:= ai*bj+ x + ci+j-1;x:= ci+j-1 div 10;ci+j-1 := x mod 10; (4) 商和余数的求法商和余数处理:视被除数和除数的位数情况进行处理.,【例1】输入两个正整数,求它们的和。 【分析】输入两个数到两个变量

3、中,然后用赋值语句求它们的和,输出。但是,我们知道,在pascal语言中任何数据类型都有一定的表示范围。而当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。 这样,我们方便写出两个整数相加的算法。,如果我们用数组A、B分别存储加数和被加数,用数组C存储结果。则上例有A1=6,A2=5, A3=8,B1=5,B2=5,B3=2,C4=1,C3=1,C2=1,C1=1,两数相加如图2所示。,因此,算法描述如下: procedure add(a,b;var c); /a,b,c都为数组,a,b,c分别存储被加数、加数、结果 v

4、ar i,x:integer; begini:=1;x:=0; /x是进位while (i=a数组长度) or(i=b数组的长度) do beginci := ai + bi + x; /第i位相加并加上次的进位x:=ci div 10; /向高位进位ci := ci mod 10; /存储第i位的值i := i + 1 /位置指针变量end 通常,读入的两个整数用可用字符串来存储,程序设计如下: program exam1; const max=200; var a,b,c:array1max of 09;n:string;lena,lenb,lenc,i,x:integer; beginw

5、rite(Input augend:);readln(n); /输入加数lena:=length(n); /加数放入a数组,for i:=1 to lena do alena-i+1:=ord(ni)-ord(0);write(Input addend:); readln(n); /输入被加数lenb:=length(n); /被加数放入b数组for i:=1 to lenb do blenb-i+1:=ord(ni)-ord(0);i:=1;x:=0;while (i0 then /处理最高进位begin lenc:=i;ci:=x; endelse lenc:=i-1;for i:=len

6、c downto 1 do write(ci); /输出结果writeln end.,【例2】高精度减法。输入两个正整数,求它们的差。 【算法分析】类似加法,可以用竖式求减法。在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位。高精度减法的参考程序: program exam2; const max=200; var a,b,c:array1max of 09; n,n1,n2:string;lena,lenb,lenc,i,x:integer; beginwrite(Input minuend:); readln(n1); /输入被减数write(Input subtrahe

7、nd:);readln(n2); /输入减数if (length(n1)length(n2) or (length(n1)=length(n2) and (n11) do dec(lenc);for i:=lenc downto 1 do write(ci);writeln end.,【例4】高精度除法。输入两个正整数,求它们的商(做整除)。 【算法分析】做除法时,每一次上商的值都在,每次求得的余数连接以后的若干位得到新的被除数,继续做除法。因此,在做高精度除法时,要涉及到乘法运算和减法运算,还有移位处理。当然,为了程序简洁,可以避免高精度乘法,用09次循环减法取代得到商的值。这里,我们讨论一

8、下高精度数除以单精度数的结果,采取的方法是按位相除法。,program exam4; const max=200; var a,c:array1max of 09;x,b:longint;n1,n2:string;lena,code,i,j:integer; beginwrite(Input dividend:); readln(n1);write(Input divisor:); readln(n2);lena:=length(n1);for i:=1 to lena do ai := ord(n1i) - ord(0);val(n2,b,code); /字符串n2转成数值b,code参数可

9、以省略x:=0; /按位相除for i:=1 to lena do beginci:=(x*10+ai) div b;x:=(x*10+ai) mod b;end;j:=1;while (cj=0) and (jlena) do inc(j); /去除高位的0for i:=j to lena do write(ci) ;writeln end.,实质上,在做两个高精度数运算时候,存储高精度数的数组元素可以不仅仅只保留一个数字,而采取保留多位数(例如一个整型或长整型数据等),这样,在做运算(特别是乘法运算)时,可以减少很多操作次数。例如图5就是采用4位保存的除法运算,其他运算也类似。具体程序可以修改上述例题予以解决,程序请读者完成。,示例:123456789 45 = 1 2345 6789 45= 274 3484 1 div 45 = 0 , 1 mod 45=1 取12345 div 45 = 274 12345 mod 45 = 15 取156789 div 45 = 3484 答案为2743484, 余数为156789 mod 45 = 9 图5,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号