1、高精度算法 由于计算机输入计算结果的精度通常受到计算机的限制,如:在双精度方式下,计算机最多只能输出 16 位有效数字,如果超过 16 位,则只能按浮点形式输出,另外,一般计算机实数表示的范围为 1038,如果超过这个范围,计算机就无法表示了。但是我们可以通过一些简单的办法来解决这个问题。这就是我们要说的高精度计算机。基本方法: 在计算机上进行高精度计算,首先要处理好以下几个基本问题:1、 数据的接收与存储; 2、计算结果位数的确定;2、 进位处理和借位处理; 4、商和余数的求法;下面我们逐一介绍一下这几个问题的解决方法。1、数据的接收与存储:要在计算机上进行高精度计算,首先就应该有精确的输入
2、,即计算机要精确地接收和存储数据。通常:、当输入的数值在计算机允许的范围内时,可以用数值型变量来接收数据。、当输入的数据超过计算机允许显示的精度范围时,采用字符来接收数据。、分离各位数字。接收数据子模块(字符型变量接收数据 ):prucedure readdata(var in:array1100 of integer);va! r ch:char;i,k:integer;beginread(ch);k:=0;while ch in09 do begininc(k);intk:=ord(ch)-48;read(ch);end;end;2、计算结果位数的确定、两数之和的位数最大为较大的数的位数加
3、 1。、乘积的位数最大为两个因子的位数之和。、阶乘与乘方的位数可以采用对数运算来确定计算结果的位数。3、进位处理和借位处理、加法的进位处理进行加法处理时,先设置一个加法进位标志 T,并将 T 的初值设为 0。当两数相加时,从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于 10,则将该单元中的数减去 10,并将进位标志 T 设为 1,当对下一单元进行相加时,还要再加上前一个单元的进位标志 T。同时将 T 再次置为 0,不断重复,直到最高位为止。具体算法为:T:=0;对变量 I 从 1 到 N,重复下列步骤:CI:=AI+BI+T;T:=0;IF CI=10 THEN BEGIN CI
4、:=CI-10;T:=1;END;、乘法的进位处理Y:=AI*BI+C;C:=Y div 10;CI+J-1:=Y-C*10、减法的借位处理IF AI ! AI+1:=AI+1-1;AI:=AI+10END IFCI:=AI-BI;4、商和余数的求法设 A,B 分别为不大于 9 位的整数,则:C:=A DIV B 为商的整数部分X:=A MOD B 为余数算法与实例:1、求任意位数的加法运算【问题分析】:、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为 A 和 B,利用字符串函数把字符串转化为数值,将 A、B 中的每一位数字分别存储在 A、B 两个数组中,最低位在第一个单元中。
5、(PASCAL语言中可以直接采用字符读取的方式来接收数据,而后通过 ORD(x)-48 的方式转化成数值。)、确定和的位数设 LA 为 A 的位数,LB 为 B 的位数,则两数之和的位数最大为较大加数位数加 1,即如果LALB,则和的位数最大为 LA+1。、进位处理进行加法处理时,先设置一个加法进位标志 T,并将 T 的初值设为 0。当两数相加时,从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于 10,则将该单元中的数减去 10,并将进位标志 T 设为 1,当对下一单元进行相加时,还要再加上前一个单元的进位标志 T。同时将 T 再次置为 0,不断重复,直到最高位为止。! 程序清单:
6、program gjdjs;const n=100;type arrtype=array1n of integer;vara,b:arrtype;t,s,j,l:integer;procedure readdata(var int:arrtype);varch:char;i,k:integer;beginwriteln(Input a number:);read(ch);k:=0;while ch in09 do begininc(k);intk:=ord(ch)-48;read(ch);end;for i:=k downto 1 do beginintn+i-k:=inti;inti:=0;
7、end;end;beginreaddata(a);readln;readdata(b);writeln;t:=0;for j:=n downto 1 do begins:=aj+bj+t;aj:=s mod 10;t:=s div 10;end;j:=1;writeln(output:);while aj=0 do j:=j+1;while jLB,则差的位数最大为 LA。、借位处理做减法运算时,要先判断是否需要借位,如果需要借位,从上一位借过一个 10,上一位的数减去 1,处理完之后再相减。、负数的处理如果减数大于被减数,则交换 A、B 的值,并令负数标志 T=-1。当打印计算结果时,先判断
8、 T 的值是否为-1,如果 T=-1,则在数值前面先输出一个负号。程序清单:program gjdjs;const n=100;type arrtype=array1n of integer;vara,b:arrtype;g,t,j,l:integer;s:char;f:boolean;procedure readdata(var int:arrtype);varch:char;i,k:integer;beginwriteln(Input a number:);read(ch);k:=0;while ch in09 do begininc(k);! intk:=ord(ch)-48;read(
9、ch);end;for i:=k downto 1 do beginintn+i-k:=inti;inti:=0;end;end;beginreaddata(a);readln;readdata(b);writeln;f:=true;j:=1;while (aj=bj) and (j=bj+g then beginaj:=aj-bj-g;g:=0;endelse beginaj:=10+aj-bj-g;g:=1;end;j:=1;writeln(output:);write(s);while (aj=0) and (j4 then bl:=bl+1;for i:=l downto 1 doif
10、 bi=10 then beginbi:=bi-10;bi-1:=bi-1+1;endelsei:=1;write(b0,.);for i:=1 to l do write(bi);end;readln;end.5、求多精度 A单精度 B 的商和余数。、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为 A 和 B,利用字符串函数把字符串转化为数值,将 A 中的每一位数字分别存储在 A 数组中,最低位在第一个单元中。 (PASCAL 语言中可以直接采用字符读取的方式来接收数据,而后通过 ORD(x)-48 的方式转化成数值。)。B 则可以用一般的整数变量来接收和存储。、算法首先,我
11、们知道,在做除法运算时,有一个不变的量和三个变化的量,不变的量是除数,三个变化的量分别是:被除数、商和余数。做除法运算时,每次都是用被除数减去商与除数的积,如果所得余数不为零,则将其扩大 10 倍再次作为被除数,继续试除,直至余数为零或达到要求的精确度为止。程序清单:program gjdcydjd;const n=100;type arrtype=array0n of integer;vara:arrtype;g,b,i,j,s:integer;procedure readdata(var int:arrtype);varch:char;i,k:integer;beginwrite(Inpu
12、t a number:);read(ch);k:=0;while ch in09 do begininc(k);intk:=ord(ch)-48;read(ch);end;for i:=k downto 1 do beginintn+i-k:=inti;inti:=0;end;end;beginreaddata(a);writeln;write(Input the numbr b:);readln(b);writeln;g:=0;for i:=1 to n do begins:=ai+g*10;ai:=s div b;g:=s mod b;! end;j:=1;writeln(output:)
13、;while (aj=0) and (j0 then writeln(,g);writeln;end.6、5、求多精度 A多精度 B 的商和余数。、数据的接收和存储采用字符串输入的方式,设参与运算的两个数分别为 A 和 B,利用字符串函数把字符串转化为数值,将 A、B 中的每一位数字分别存储在 A 和 B 数组中,最低位在第一个单元中。(PASCAL 语言中可以直接采用字符读取的方式来接收数据,而后通过 ORD(x)-48 的方式转化成数值。)。、算法可以用减法代替除法运算:不断比较 A1n与 B1n的大小,如果 A1n=B1n,商 C1n+1 C1n,然后就是一个减法过程:A1n-B1nA1
14、n。由于简单的减法速度太慢,故必须进行优化。设置一个位置值 J,当 A1nB1n时。B1n左移B0n,j:=j+1,即令 B1n增大 10 倍。这样就减少了减法的次数。当 j0 且 A1n.n时,B0n右移B0n,j:=j-1 ,即令B1n缩小 10 倍。程序清单: Borland PASCAL V7.0 语言源程序program! gjdcygjd;const n=100;type arrtype=array1n of integer;vara,b,c:arrtype;g,s,i,j,k,l:integer;procedure readdata(var int:arrtype);varch:
15、char;i,k:integer;beginwrite(Input a number:);read(ch);k:=0;while ch in09 do begininc(k);intk:=ord(ch)-48;read(ch);end;for i:=k downto 1 do beginintn+i-k:=inti;inti:=0;end;end;function f(a,b:arrtype):boolean;var j:integer;beginf:=true;j:=1;while (aj=bj) and (j=bi+g thenbeginai:=ai-bi-g;g:=0;endelsebe
16、ginai:=10+ai-bi-g;g:=1;end;end;procedure ine(n:integer);var i,s:integer;beging:=0;cn:=cn+1;for i:=n downto 1 do begins:=ci+g;c! i:=s mod 10;g:=s div 10;end;end;beginreaddata(a);readln;readdata(b);writeln;j:=1;while f(a,b) do beginj:=j+1;for i:=2 to n do bi-1:=bi;bn:=0;end;while j0 do beginwhile f(a,b) do beginine(n-j+1);sub;end;j:=j-1;for i:=n downto 2 do beginbi:=bi-1;bi-1:=0;end;end;j:=1;writeln(output:);while (cj=0) and (j=n do beginwrite(cj);inc(j);end;j:=1;while (aj=0) and (j=n) do j:=j+1;if j=n then write();while j=n do beginwrite(aj);inc(j);end;writeln;end.