版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高精度算法大全在一般的科学计算中,会经常算到小数点后几白位或者更多,当然也可能是几千 亿几白亿的大数字.一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据 的一种模拟加,减,乘,除,乘方,阶乘,开放等运算.譬如一个很大的数字N >= 10A 100,很显然这样的数字无法在计算机中 正常存储.于是,我们想到了办法,将这个数字拆开,拆成一位一位的 或者是四位四 位的存储到一个数组中,用一个数组去表示一个数字.这样这个数字就被称谓是 高精度数.对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了 高精度算法:由于计算机输入计算结果的精度通常受到计算机的限制,如:在双
2、精度方式下,计算机最多只能输出16位有效数字,如果超过16位,则只能按浮点形式输 出,另外,一般计算机实数表示的范围为 1038,如果超过这个范围,计算机就无 法表示了。但是我们可以通过一些简单的办法来解决这个问题。这就是我们要说的高精度计算机。一、基本方法:在计算机上进行高精度计算,首先要处理好以下几个基本问题:1、数据的接收与存储;2、计算结果位数的确定;3、进位处理和借位处理;4、商和余数的求法; 下面我们逐一介绍一下这几个问题的解决方法。1、数据的接收与存储:要在计算机上进行高精度计算,首先就应该有精确的输入,即计算机要精确地接 收和存储数据。通常: 、当输入的数值在计算机允许的范围内
3、时,可以用数值型变量来接收数据。 、当输入的数据超过计算机允许显示的精度范围时,采用字符来接收数据。 、分离各位数字。接收数据子模块(字符型变量接收数据):prucedure readdata(var in:array1.100 of integer);var ch:char;1, k:integer;beginread(ch);k:=0;while ch in'0'.'9' do begininc(k);intk:=ord(ch)-48;read(ch);end;end;2、计算结果位数的确定 、两数之和的位数最大为较大的数的位数加1 、乘积的位数最大为两个因
4、子的位数之和。、阶乘:lgn!=lgn+lg(n-1)+lg(n-2)+lg3+lg2+lg1=lnn/ln10+ln(n-1)/ln10+ln(n-2)/ln10+ln3/ln10+ln2/ln10+ln1/ln10=trunc(1/ln10* (lnn+ln(n-1)+ln(n-2)+ln3+ln2+ln1)乘方:lg(a Ab)=trunc(lg(aAb)+1=trunc(b*lg a )+1=trunc(b*ln a / ln10)+13、进位处理和借位处理 、加法的进位处理进行加法处理时,先设置一个加法进位标志T,并将T的初值设为0。当两数相加时,从低位到高位,各位数字分别相加,如果
5、相加后某个单元中的数大于10,贝U将该单元中的数减去10,并将进位标志T设为1 ,当对下一单元进行相加时,还要再加上前一 个单元的进位标志T。同时将T再次置为0,不断重复,直到最高位为止。具体算法为:T:=0;对变量I从1到N,重复下列步骤:Ci:=Ai+Bi+T;T:=0;IF Ci>=10 THEN BEGINCi:=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
6、位的整数,贝U:C:=A DIV B为商的整数部分X:=A MOD B为余数二、算法与实例:1、求任意位数的加法运算【问题分析】: 、数据的接收和存储采用字符申输入的方式,设参与运算的两个数分别为A和B,利用字符申函数把字符申转化为数值,将A、B中的每一位数字分别存储在 A、B两个数组中,最低位在第一 个单元中。(PASCA邸言中可以直接采用字符读取的方式来接收数据,而后通过ORD(x)-48的方式转化成数值 。) 、确定和的位数设LA为A的位数,LB为B的位数,则两数之和的位数最大为较大加数位数加1,即如果LA>LB,则和的位数最大为LA+1。 、进位处理进行加法处理时,先设置一个加法
7、进位标志T,并将T的初值设为0。当两数相加时,从低位到高位,各位数字分别相加,如果相加后某个单元中的数大于10,则将该单元中的数减去10,并将进位标志T设为1 ,当对下一单元进行相加时,还要再加上前一 个单元的进位标志T。同时将T再次置为0 ,不断重复,直到最高位为止。程序活单:program gjdjs;const n=100;type arrtype=array1.n of integer;vara,b:arrtype;t,s,j,l:integer;procedure readdata(var int:arrtype);varch:char;i,k:integer;beginwritel
8、n('Input a number:');read(ch);k:=0;while ch in'0'.'9' do begin inc(k);intk:=ord(ch)-48;read(ch);end;for i:=k downto 1 do begin intn+i-k:=inti;inti:=0;end;end;beginreaddata(a);readln;readdata(b);writeln;t:=0;for j:=n downto 1 do begin s:=aj+bj+t;aj:=s mod 10;t:=s div 10;end;j:
9、=1;writeln('output:');while aj=0 do j:=j+1;while j<=n do begin write(aj);inc(j);end;writeln;end.高精度正实数加法计算。例2.从键盘上读入两个100位长的正实数,编程求出它们的和分析:与上例不同,我们这次考要考虑的是实数问题,即小数点的问题,我们按照小学数学中的带小数的数的加法规则,应该先对齐小数点,然后实施加法, 所以可以先对齐小数点,然后删除小数点实施整数加法,最后还原小数点。对于最后的结果,还要进行规格化:小数最后的零应该省去。这里我们用逐步求精的方法给出程序:progra
10、m正实数加法1-1 :以字符申的形式读入两个实数;1-2 :对齐小数点和各相应数位;1-3 :记录小数点的位置,删除加数和被加数中的小数点;1-4:按照整数加法求出和;1-5:还原小数点;1-6:规格输出结果。1- 2 :对齐小数点和各相应数位部分的求精1-2-1 :根据小数点的位置判断是否是整数,若是整数则在最后添上小数点;1-2-2 :分别记录加数和被加数小数点的位置和整数部分、小数部分的长度;1-2-3 :在整数部分较短的数前面添零,在小数部分较短的数后面添零对齐各相应数位;1-2-4 :重新记录小数点的位置,即整数部分的长度。1-6 :规格输出结果部分的求精:1-6-1 :最后一位是零
11、则删除最后一位;1-6-2 :若小数部分被删除玩,即最后一位是小数点则删除小数点。按照以上的逐步求精,编制程序如下:vars1,s2,s3 : string; (用字符申表示加数、被加数和和11,12 : integer; (加数和被加数的位数(长度)z1,z2,x1,x2 : integer; (加数和被加数的整数部分和小数部分的位数 (长度)pointpos : integer; (小数点的位置i,j,k : integer;beginreadln(s1);readln(s2);k:=pos('.',s1);if k=0 then s1:=s1+'.'k:=
12、pos('.',s2);if k=0 then s2:=s2+'.' 添上小数点l1:=length(s1);k:=pos('.',s1); z1:=k-1;x1:=l1-k;l2:=length(s2);k:=pos('.',s2); z2:=k-1;x2:=l2-k; 记录小数点的位置if z1>z2 then 整数部分对齐for k:=1 to z1-z2 do s2:='0'+s2elsefor k:=1 to z2-z1 do s1:='0'+s1;if x1>x2 then
13、小数部分对齐for k:=1 to x1-x2 do s2:=s2+'0'elsefor k:=1 to x2-x1 do s1:=s1+'0'k:=pos('.',s1);delete(s1,k,1);delete(s2,k,1);s3:=s1;pointpos:=k;删除小数点j:=0;for i:=length(s3) downto 1 dobegink:=ord(s1i)-ord('0')+ord(s2i)-ord('0')+j;if k>9 then begin j:=1 ;k:=k-10 end
14、else j:=0;s3i:=chr(ord('0')+k);end; 逐位加法计算 if j=1 thenbegins3:='1'+s3; 最高位的进位pointpos:=pointpos+1; end;insert('.',s3,pointpos); 还原小数点while s3length(s3)='0' do delete (s3,length(s3),1);删除小数部分末尾的零if s3length(s3)='.' then delete (s3,length(s3),1);根据条件删除小数点writeln
15、(s3);end.2、求任意位数的减法运算 、数据的接收和存储采用字符申输入的方式,设参与运算的两个数分别为A和B,利用字符申函数把字符申转化为数值,将A、B中的每一位数字分别存储在 A、B两个数组中,最低位在第一 个单元中。(PASCA邸言中可以直接采用字符读取的方式来接收数据,而后通过 ORD(x)-48的 方式转化成数值 。) 、确定差的位数设LA为A的位数,LB为B的位数,则两数之差的位数最大为较大数的位数,即如果LA>L§则差的位数最大为LA。 、借位处理做减法运算时,要先判断是否需要借位,如果需要借位,从上一位借过一个10,上一位的数减去1,处理完之后再相减。 、负
16、数的处理如果减数大于被减数,则交换A B的值,并令负数标志T=-1。当打印计算结果 时,先判 断T的值是否为-1,如果T=-1 ,则在数值前面先输出一个负号。程序活单:program gjdjs;const n=100;type arrtype=array1.n 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
17、:=0;while ch in'0'.'9' 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);readln;readdata(b);writeln;f:=true;j:=1;while (aj=bj) and (j=bj+g then begin aj:=aj-bj-g;g:=0; endelse beginaj:=10+aj-bj-g;g:=1;end;j:=1;write
18、ln('output:');write(s);while (aj=0) and (j<=n do beginwrite(aj);inc(j);end;writeln;end.3、求任意位数的乘法运算 、数据的接收和存储采用字符申输入的方式,设参与运算的两个数分别为A和B,利用字符申函数把字符申转化为数值,将A、B中的每一位数字分别存储在 A、B两个数组中,最低位在第一 个单元中。(PASCA邸言中可以直接采用字符读取的方式来接收数据,而后通过ORD(x)-48的方式转化成数值 。) 、确定积的位数设LA为A的位数,LB为B的位数,乘积的位数最多为 LA+LB最少为LA+L
19、B-1。 所以,乘积的位数上限为LA+LB 、算法10首先计算被乘数与乘数的个位数字的乘积,把结果保存到积数组中,然后再用被 乘数去乘以乘数的十位数字,把结果退一位加到积数组中。每加一次乘积结果就进行一次进位处理,其方法与加法中的进位处理一样。程序活单:program gjdcs;const n=100;type arrtype=array0.n of integer;arrtype2=array1.2*n of integer;vara,b,d:arrtype;c:arrtype2;g,i,j,s:integer;procedure readdata(var int:arrtype);var
20、ch:char;i,k:integer;beginwriteln('Input a number:');read(ch);k:=0;while ch in'0'.'9' do begininc(k);intk:=ord(ch)-48;read(ch);end;for i:=k downto 1 do beginintn+i-k:=inti;end;end;beginreaddata(a);readln;readdata(b);writeln;for i:=n downto 1 do beging:=0;for j:=n downto 1 do b
21、egins:=aj*bi+g;dj:=s mod 10;g:=s div 10;end;d0:=s;g:=0;for j:=n downto 0 do begins:=dj+ci+j+g;ci+j:=s mod 10;g:=s div 10end;end;4、求A-B的精确值由于A和B都是计算机允许的显示精度,故 A B均可使用数值变量来接收与存储。A+ B精确值有两种情况: 、A能被B整除,没有余数。 、A不能被B整除,对余数进行处理。首先,我们知道,在做除法运算时,有 一个不变的量和三个变化的量,不变的量是除数,三个变化的量分别是:被除数、商和余数。做除法运算时,每次都是用被除数减去商与除
22、数的积,如果所得余数不为零,则将其扩大10倍再次作为被除数,继续试除,直至余数为零或达到要求的精确度为止。最后,必须对精确度的后一位求商,然后判断其值而四舍五入得出最后的结果。程序活单:program jqdcf;const n=100;type arrtype=array0.n of integer;vara,b,c:arrtype;i,j,k,l,m:integer;beginwrite('Input a number:');readln(m);write('Input a number:');readln(k);write('Input a acc
23、uracy:');readln(l);write(m,'/',k,'=');a0:=m;b0:=m div k;c0:=m mod k;if c0=0 then write(b0)else beginfor i:=1 to l+1 do beginai:=ci-1*10;bi:=ai div k;ci:=ai mod k;if ci=0 then i:=l+1;end;if bl+1>4 then bl:=bl+1;for i:=l downto 1 do if bi>=10 then beginbi:=bi-10;bi-1:=bi-1+1;
24、endelsei:=1;write(b0,'.');for i:=1 to l do write(bi);end;readln;end.5、求多精度A+单精度B的商和余数。 、数据的接收和存储采用字符申输入的方式,设参与运算的两个数分别为 A和B,利用字符申函数把 字符申转化为数值,将A中的每一位数字分别存储在A数组中。(PASCA邸言中 可以直接采用字符读取的方式来接收数据,而后通过ORD(x)-48的方式转化成数 值。)。B则可以用一般的整数变量来接收和存储。 、算法首先,我们知道,在做除法运算时,有一个不变的量和三个变化的量,不变的量是除数,三个变化的量分别是:被除数、商
25、和余数。做除法运算时,每次都是用 被除数减去商与除数的积,如果所得余数不为零,则将其扩大10倍再次作为被除数,继续试除,直至余数为零或达到要求的精确度为止。程序活单:program gjdcydjd;type arrtype=array0.100000000 of integer;var,d:arrtype;g,b,i,j,s,k,l:integer;c:ansistring;beginassign(input,'in.txt');reset(input);assign(output,'out.txt');rewrite(output);readln(c);l:
26、=length(c);for i:=1 to l do ai:=ord(ci)-48;readln(b);g:=0;k:=0;for i:=1 to l do begins:=ai+g*10;k:=k+1;dk:=s div b;g:=s mod b;end;j:=1;while dj=0 do j:=j+1;for i:=j to k do write(di);if g<>0 then writeln('',g);close(input);close(output);end.、5、求多精度A+多精度B的商和余数。、数据的接收和存储采用字符申输入的方式,设参与运算的
27、两个数分别为A和B,利用字符申函数把字符申转化为数值,将A B中的每一位数字分别存储在A和B数组中。(PASCAL语言中可以直接采用字符读取的方式来接收数据,而后通过ORD(x)-48的方式转化成数值。)。、算法可以用减法代替除法运算:不断比较A1.n与B1.n的大小,如果A1.n>=B1.n则商 C1.n+1 t C1.n,然后就是一个减法过程:A1.n-B1.n t A1.n。由于简单的减法速度太慢,故必须进行优化。设置一个位置值J,当 A1.n>B1.n 时。B1.n左移-B0.n , j:=j+1 ,即令 B1.n增大 10 倍。这样就减少了减法的次数。当j>0且A1
28、.n.n时,B0.n右移-B0.n, j:=j-1 ,即令 B1.n缩小 10 倍。程序活单:Borland PASCAL V7.0 语言源程序program gjdcygjd;const n=100;type arrtype=array1.n of integer;vara,b,c:arrtype;g,s,i,j,k,l:integer;procedure readdata(var int:arrtype);varch:char;i,k:integer;beginwrite('Input a number:');read(ch);k:=0;while ch in'0&
29、#39;.'9' do begininc(k);intk:=ord(ch)-48;read(ch);end;end;function f(a,b:arrtype):boolean;var j:integer;beginf:=true;j:=1;while (aj=bj) and (j=bi+g) dobeginai:=ai-bi-g;g:=0;endelsebeginai:=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 d
30、o begin s:=ci+g;ci:=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 j>0 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('o
31、utput:');while (cj=0) and (j<=n do begin write(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.阶乘的计算计算50!的精确值。其中50! =1*2*3*4*50。50!是个很大的数字,通过数学计算我们知道它的值大约在1060-1070左右,显然用TurboPascal的实数和整数都是不能存储的,
32、还是得使用高精度计算。这个问题的情况比较特殊,参与乘法的两个乘数一个是高精度数,另一个是常规的整数,为此我们采用整数数组去存储结果。这里还是以12! =12*11! =12*39916800为例说明这个计算过程:a数组存放的是上一次阶乘的结果 39916800,因为这个乘积最大可能是1060-1070,我们定义a为array1.100 of integer ,所以此时a数组的存放情况为:I 1 2 3 4 5 6 7 8 9 1098 99 100Ai 0 0 8 6 1 9 9 3 0 00 0 0在进行计算时将a中的各个元素分别同乘数相乘,结果存放在当前位,上面的 a 数组同12相乘,得到
33、的中间结果为:I 1 2 3 4 5 6 7 8 9 1098 99 10012*ai 0 096 72 12 108 108 36 0 00 0 0实现相乘的程序段很简单:for j:=1 to 100 do aj:=aj*i;为了避免多次乘积时将乘积累乘至很大的数造成溢出,每次乘积运算之后将处理 进位,进位的方法同加法,但是有进多位的可能。上例中 a3将向a4进位9,进位后a3=6 ,a4=81,同时a4在向a5进位9,进位后a4=1 ,a5=20下面的程序段可以实现这个进位处理:for j:=1 to 100 dobegink:=aj; (事先复制aj保存aj:=k mod 10; (最
34、后一位留下aj+1:=aj+1+k div 10; (上一位接受进位end;实施进位处理后的a数组为:I 1 2 3 4 5 6 7 8 9 1098 99 100ai 0 0 6 1 0 0 9 7 4 00 0 0这同我们手工计算的12! =479001600是一样的 vara:array0.100 of integer;i,j,k:integer;begina0:=1;for i:=1 to 100 do ai:=0;a0:=1;for i:=2 to 50 dobeginfor j:=0 to 100 do aj:=aj*i;for j:=0 to 100 dobegink:=aj;a
35、j:=k mod 10;aj+1:=aj+1+k div 10;end;end;j:=100;while aj=0 do j:=j-1;writeln;write('50!=');for i:=j downto 0 do write(ai);end.在这个程序中我们使用了 100位的数组存放中间结果,但是对于大部分的情况都 不会用到100位,前面的零都是不必要进行乘法运算的, 我们可以考虑使用一个 数值记录当前被乘数的有效位数,即自右向左非零数的个数。这样可以省略很多无益的计算,大大提高计算效率。计算两高精度实数的乘法.program lxw012;const n1=250;
36、n2=500;type strn=string250;intn22=array -1.500 of integer;var a1,b1,c1:intn22;ch1,ch2:strn;i:integer;procedure chtoint2(ch:strn; var a:intn22);var i,j,t,dot:integer;beginfor i:=1 to n2 do ai:=0;a0:=1; j:=0; dot:=0;for i:=1 to length(ch) docase chi of'0'.'9': begin j:=j+1; aj:=ord(chi
37、)-ord('0') end;'.': dot:=j;'-': a0:=-1elseend;if dot=0 then dot:=j;t:=0;repeat t:=t+1 until at>0;a-1:=dot-t+1;if t>1 then beginfor i:=1 to j-t do ai:=ai+t-1;for i:=j-t+1 to j do ai:=0end;end;procedure frmt(var f:intn22);var j,fj,fj1:integer;beginfor j:=n2 downto 2 dobeg
38、infj:=fj;if(fj>9) thenbeginfj1:=fj div 10;fj-1:=fj-1+fj1;fj:=fj-(fj1*10)end;endend;procedure multy(d,e:intn22; var f:intn22);( d*e t f var k,j,dj:integer;beginfor j:=1 to n2 do fj:=0;for j:=1 to n1 dobegindj:=dj;if dj>0 thenfor k:=j+1 to n1+j do fk:=fk+dj*ek-j;if (j mod 100 =0) then frmt(f);en
39、d;frmt(f); f0:=d0*e0; f-1:=d-1+e-1end;procedure prtc2(var c1:intn22);var t,i,j:integer;beginif c10=-1 then write('-');t:=n2+1;repeat t:=t-1 until c1t>0;if c1-1>0thenbeginj:=1;if c11=0 then j:=2;for i:=j to c1-1 do write(c1i);write('.');for i:=c1-1+1 to t do write(c1i)endelsebeg
40、inwrite('0.');if c1-1<0 thenfor i:=1 to abs(c1-1) do write('0');for i:=1 to t do write(c1i)end;end;begin main for i:=1 to n1 do ch1i:=''ch2:=ch1; writeln;writeln('输入被乘数(<=250 位):'); readln(ch1);writeln('输入乘数(<=250 位):'); readln(ch2);chtoint2(ch1,a1);
41、chtoint2(ch2,b1);writeln; writeln('计算结果:');prtc2(a1); writeln('*');if b10<0then begin write('('); prtc2(b1); write(')'); endelse prtc2(b1);writeln('=');multy(a1,b1,c1);prtc2(c1); writeln;end.编程实现两个高精度实数减法,两数分别由键盘输入,均不超过2 4 0位program lxw011;const n1=250; n2=
42、500;type strn=string250;intn2=array 0.500 of shortint;var a1,b1,c1:intn2;ch1,ch2:strn;operch:char;i,t1:integer;procedure chtoint(ch:strn; var a:intn2);将字符申量转换为整型数组var i,j,t,dot:integer;beginfor i:=1 to n2 do ai:=0;a0:=1; j:=0; dot:=0;for i:=1 to length(ch) docase chi of'0'.'9': begin
43、 j:=j+1; aj:=ord(chi)-ord('0') end;'.': dot:=j;'-': a0:=-1elseend;if dot=0 then dot:=j;t:=n1-dot;for i:=j downto 1 do ai+t:=ai;for i:=1 to t do ai:=0;end;procedure plus(var a1,b1,c1:intn2);加法运算var i:integer;beginfor i:=1 to n2 do c1i:=a1i+b1i;for i:=n2 downto 2 doif c1i>9
44、thenbegin c1i:=c1i-10; c1i-1:=c1i-1+1 end;c10:=a10;end;procedure minus(var a1,b1,c1:intn2);减法运算var i,max:integer;a2,b2:intn2;beginmax:=1; i:=0;repeati:=i+1;if b1i>a1i then max:=2until (b1i<>a1i) or (i=n2);a2:=a1; b2:=b1;if max=2 then begin a2:=b1; b2:=a1 end;for i:=n2 downto 2 dobeginif a2i
45、<b2i thenbegina2i:=a2i+10;a2i-1:=a2i-1-1end;c1i:=a2i-b2iend;c11:=a21-b21;c10:=1;if(max=2)and(a10=1)or(max=1)and(a10=-1)then c10:=-1end;procedure prtc1(var c1:intn2);var t,i:integer;beginif c10=-1 then write('-');t:=0;repeat t:=t+1 until c1t>0;if t>n1 then t:=n1;for i:=t to n1 do wri
46、te(c1i);write('.');t:=n2+1;repeat t:=t-1 until c1t>0;if t<n1+1 then t:=n1+1;for i:=n1+1 to t do write(c1i);end;begin main for i:=1 to n1 do ch1i:=''ch2:=ch1; writeln;writeln('输入被加数(<=250 位):'); readln(ch1);repeatwriteln('输入运算符(+/-):'); readln(operch);until (o
47、perch='-') or (operch='+');writeln('输入加数(<=250 位):'); readln(ch2);chtoint(ch1,a1); chtoint(ch2,b1);writeln; writeln('计算结果:');prtc1(a1); writeln(operch);if b10<0then begin write('('); prtc1(b1); write(')') endelse prtc1(b1);writeln('=');t1
48、:=1;if operch='-' then t1:=-1;if a10=t1*b10 then plus(a1,b1,c1)else minus(a1,b1,c1);prtc1(c1); writeln;end.以字符申形式由键盘输入两个高精度的8进制正整数,申长小于2 5 5 ,以第一个数为被除数,第二个数为除数,进行高精度除法运算,并显小按 8进制表示的商和余数。program lxw019;conststr2:string32='000 001 010 011 100 101 110 111str8:string32='0 1 2 3 4 5 6 7 &
49、#39;var a1,a2: string;flag2:boolean; i:integer;function s8to2(s8:string):string;var i,j:integer; s:string;begins:=''for i:=1 to length(s8) dobeginj:=-3;repeat j:=j+4 until str8j=s8i;s:=s+copy(str2,j,3)end;s8to2:=send;function s2to8(s2:string):string;var i,j:integer; s,t: string;beginwhile (l
50、ength(s2) mod 3)>0 do s2:='0'+s2; s:=''for i:=1 to (length(s2) div 3) dobegint:=copy(s2,1,3); delete(s2,1,3);j:=-3;repeat j:=j+4 until copy(str2,j,3)=t;s:=s+str8jend;s2to8:=send;procedure minus(a,b:string; var c:string; var flag:boolean);var i,i1,j,lb:integer;beginflag:=true; lb:=
51、length(b);while length(a)<lb do a:='0'+a;while (length(a)>lb) and (a1='0') do delete(a,1,1);if (a<b) and (length(a)=lb)then begin flag:=false; exit end;c:=''for i:=lb downto 1 dobegini1:=i;if length(a)>lb then i1:=i+1;if ai1=bi then c:='0'+celse if ai1>
52、bi then c:='1'+celse beginj:=i1;repeataj:=succ(succ(aj);aj-1:=pred(aj-1);j:=j-1;until aj='0'c:='1'+cend;end;while (c1='0') and (length(c)>1) do delete(c,1,1)end;procedure divid(a,b:string);var c,d,e:string;flag:boolean; lb:integer;beginwhile (b1='0')and(lengt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年黟县国有投资集团有限公司公开招聘劳务派遣人员备考题库及参考答案详解1套
- 2026年绍兴市上虞区教育体育局公开招聘高水平体育教练员备考题库及完整答案详解一套
- 中学学生宿舍用电管理制度
- 2026年江苏省人民医院肺癌中心科研助理招聘备考题库完整答案详解
- 南平市教育局关于2026年南平市教育类储备人才引进备考题库及参考答案详解1套
- 东莞市城建工程管理局2025年公开招聘编外聘用人员备考题库及一套完整答案详解
- 企业员工培训与职业成长路径制度
- 企业内部资料管理制度
- 2026年泉州市医学会招聘工作人员的备考题库参考答案详解
- 2026年投资入股合同协议
- 学堂在线 雨课堂 学堂云 中国建筑史-元明清与民居 期末考试答案
- GB/T 45752-2025矿用车载灭火系统安全技术要求
- 安置房举行活动方案
- 国家开放大学《理工英语4》期末机考题库
- 货车司机外包合同协议
- 游戏推广合作协议书范本
- 房地产企业分红权激励方案
- 车辆维修安全培训
- 2025版国家开放大学法学本科《知识产权法》期末纸质考试总题库
- 九宫数独200题(附答案全)
- 部编版八年级上册语文《期末考试卷》及答案
评论
0/150
提交评论