高精度计算9527_第1页
高精度计算9527_第2页
高精度计算9527_第3页
高精度计算9527_第4页
高精度计算9527_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章第一章 高精度计算高精度计算 利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。介绍常用的几种高精度计算的方法。计的方法去实现这样的高精度计算。介绍常用的几种高精度计算的方法。 高精度计算中需要处

2、理好以下几个问题:高精度计算中需要处理好以下几个问题:(1)数据的接收方法和存贮方法数据的接收方法和存贮方法 数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。另一种方法是直接用循环加数组方法输入数据。另一种方法是直接用循环加数组方法输入数据。(2) 高精度数位数的确定高精度数位数的确定 位数的确定:接收时往往是用字符串的,所以它的位数就等于字符串的长度。位数的确定:接收时往

3、往是用字符串的,所以它的位数就等于字符串的长度。(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) 商和余数的求法商和余数的求法 商和余数处理:视被除数和除数的位数

4、情况进行处理商和余数处理:视被除数和除数的位数情况进行处理.【例【例1】输入两个正整数,求它们的和。输入两个正整数,求它们的和。【分析【分析】 输入两个数到两个变量中,然后用赋值语句求它们的和,输出。但是,我们知道,在pascal语言中任何数据类型都有一定的表示范围。而当两个被加数很大时,上述算法显然不能求出精确解,因此我们需要寻求另外一种方法。在读小学时,我们做加法都采用竖式方法,如图1。 这样,我们方便写出两个整数相加的算法。 8 5 6 + 2 5 5 1 1 1 1 图1 A3 A2 A1+ B3 B2 B1 C4 C3 C2 C1 图2 如果我们用数组A、B分别存储加数和被加数,用数

5、组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分别存储被加数、加数、结果var i,x:integer;begin i:=1; x:=0; /x是进位 while (i=a数组长度) or(i=b数组的长度) do begin ci := ai + bi + x; /第i位相加并加上次的进位 x:=ci div 10; /向高位进位 ci := ci mod 10; /存储第

6、i位的值 i := i + 1 /位置指针变量 end通常,读入的两个整数用可用字符串来存储,通常,读入的两个整数用可用字符串来存储,程序设计如下:程序设计如下:program exam1;const max=200; var a,b,c:array1.max of 0.9; n:string; lena,lenb,lenc,i,x:integer;begin write(Input augend:);readln(n); /输入加数 lena:=length(n); /加数放入a数组 for i:=1 to lena do alena-i+1:=ord(ni)-ord(0); write(I

7、nput 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 (i=lena) or(i0 then /处理最高进位 begin lenc:=i;ci:=x; end else lenc:=i-1; for i:=lenc downto 1 do write(ci); /输出结果 writelnend.【例【例2】高精度减法。输入两个正整数,求它们的差。高精度减法。输入两个正整数,求它们的差。【算法分析【算法

8、分析】 类似加法,可以用竖式求减法。在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位。高精度减法的参考程序:program exam2;const max=200; var a,b,c:array1.max of 0.9; n,n1,n2:string; lena,lenb,lenc,i,x:integer;begin write(Input minuend:); readln(n1); /输入被减数 write(Input subtrahend:);readln(n2); /输入减数 if (length(n1)length(n2) or (length(n1)=lengt

9、h(n2) and (n1n2) then begin /处理被减数和减数 n:=n1; n1:=n2; n2:=n; /交换减数和被减数 write(-) /交换了减数和被减数,结果为负数 end; lena:=length(n1); lenb:=length(n2); for i:=1 to lena do alena-i+1:=ord(n1i)-ord(0); for i:=1 to lenb do blenb-i+1:=ord(n2i)-ord(0); i:=1; x:=0; while (i=lena) or(i=lenb) do begin if ai1) do dec(lenc)

10、; /最高位的0不输出 for i:=lenc downto 1 do write(ci);end. 【例【例3】高精度乘法。输入两个正整数,求它们的积高精度乘法。输入两个正整数,求它们的积。【算法分析【算法分析】 类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加,如图3、图4。 分析C数组下标的变化规律,可以写出如下关系式:C i = C i +C ”i +由此可见,C i跟Ai*Bj乘积有关,跟上次的进位有关,还跟原C i的值有关,分析下标规律,有Ci+j-1:= Ai*Bj+ x + Ci+j-1 ; x:= Ci+j-1 div 1

11、0 ; Ci+j-1 := Ci+j-1mod 10; 8 5 6 2 5 4 2 8 0 1 7 1 2 2 1 4 0 0 图3A 3 A 2 A 1 B 2 B 1 C4C3 C2 C1 C”5C”4C”3C”2 C 6 C 5 C 4 C 3 C 2 C 1 图4高精度乘法的参考程序:高精度乘法的参考程序:const max=200;var a,b,c:array1.max of 0.9; n1,n2:string; lena,lenb,lenc,i,j,x:integer;begin write(Input multiplier:); readln(n1); write(Input

12、multiplicand:); readln(n2); lena:=length(n1); lenb:=length(n2); for i:=1 to lena do alena-i+1:=ord(n1i)-ord(0); for i:=1 to lenb do blenb-i+1:=ord(n2i)-ord(0); for i:=1 to lena do begin x:=0; /用于存放进位 for j:=1 to lenb do begin /对乘数的每一位进行处理 ci+j-1 := ai*bj + x + ci+j-1; /当前乘积+上次乘积进位+原数 x:=ci+j-1 div 1

13、0; ci+j-1 := ci+j-1 mod 10; end; ci+j:= x; /进位 end; lenc:=i+j; while (clenc=0) and (lenc1) do dec(lenc); for i:=lenc downto 1 do write(ci); writelnend.【例【例4】高精度除法。输入两个正整数,求它们的商高精度除法。输入两个正整数,求它们的商(做整除)。(做整除)。【算法分析【算法分析】 做除法时,每一次上商的值都在,每次求得的余数连接以后的若干位得到新的被除数,继续做除法。因此,在做高精度除法时,要涉及到乘法运算和减法运算,还有移位处理。当然,为

14、了程序简洁,可以避免高精度乘法,用09次循环减法取代得到商的值。这里,我们讨论一下高精度数除以单精度数的结果,采取的方法是按位相除法。program exam4;const max=200;var a,c:array1.max of 0.9; x,b:longint; n1,n2:string; lena,code,i,j:integer;begin write(Input dividend:); readln(n1); write(Input divisor:); readln(n2); lena:=length(n1); for i:=1 to lena do ai := ord(n1i)

15、 - ord(0); val(n2,b,code); /字符串n2转成数值b,code参数可以省略 x:=0; /按位相除 for i:=1 to lena do begin ci:=(x*10+ai) div b; x:=(x*10+ai) mod b; end; j:=1; while (cj=0) and (j0 DOw beginw w := w+1;w aw := x mod 10;w x := x div 10;w end;wend;begin a1 := 1; w := 1; readln(n); for i := 1 to n do jc(i); for j := w down

16、to 1 do write(aj); writeln;end.3、求、求n累加和累加和【问题描述【问题描述】用高精度方法,求s=1+2+3+n的精确值(n以一般整数输入)。【输入样例【输入样例】ja.in 10【输出样例【输出样例】ja.out 55wprogram ex1-3;wvarw i,w,n : longint;w a : array1.100 of longint;wprocedure jia(k : longint);wvarw j,x : longint;wbeginw x := a1+k;w w := 0;w while x0 dow beginw w := w+1;w aw

17、 := x mod 10;w x := aw+1+x div 10;w end;wend;begin assign(input,ja.in); reset(input); assign(output,ja.out); rewrite(output); readln(n); w := 1; for i := 1 to n do jia(i); for i := w downto 1 do write(ai); writeln; close(input); close(output);end.5、蜜蜂路线、蜜蜂路线(bee.pas)【问题描述【问题描述】 一只蜜蜂在下图所示的数字蜂房上爬动,已知它

18、只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房M开始爬到蜂房N,Mlenb then l:=lena w else l:=lenb; for i:=1 to l do ci:=ai+bi; for i:=1 to l do if ci=10 then begin ci:=ci-10; ci+1:=ci+1+1; end; if cl+10 then l:=l+1; a:=b;lena:=lenb;b:=c;lenb:=l; end; begin readln(m,n); if mn then exit else if n-m=1 then writeln(1) else begi

19、n a1:=1;b1:=1; lena:=1;lenb:=1;l:=0; for i:=3 to n-m+1 do add(a,b,c); for i:=l downto 1 do write(ci); end; end. 3、求、求n累加和累加和【问题描述【问题描述】用高精度方法,求s=1+2+3+n的精确值(n以一般整数输入)。【输入样例【输入样例】ja.in 10【输出样例【输出样例】ja.out 554、阶乘和、阶乘和(sum.pas)【问题描述【问题描述】已知正整数N(N=100),设S=1!+2!+3!+.N!。其中!表示阶乘,即N!=1*2*3*(N-1)*N,如:3!=1*2*

20、3=6。请编程实现:输入正整数N,输出计算结果S的值。【输入样例【输入样例】sum.in4【输出样例【输出样例】sum.out335、高精度求积、高精度求积(MULTIPLY.PAS)【问题描述【问题描述】输入两个高精度正整数M和N(M和N均小于100位)。【问题求解【问题求解】求这两个高精度数的积。【输入样例【输入样例】MULTIPLY.IN363【输出样例【输出样例】MULTIPLY.OUT1086、天使的起誓(、天使的起誓(YUBIKILI.pas)【问题描述【问题描述】TENSHI非常幸运的被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样,要宣誓。宣誓仪式是每位天

21、使各自表述自己的使命,她们的发言稿被放在N个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码、N-1、N。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从号盒子开始按顺时针方向的第几个。例如:有个盒子,那么如果TENSHI手上的数字为,那么她的发言稿所在盒子就是第个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门”TENSHI宣誓结束以后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。【问题求解【问题求解】请帮助这位天使找到她想找的宝盒的编号。【输入格式【输入格式】从文件YUBIKILI.IN的第一、二行分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论