在实际中,我们常常需要进行一些很大的数的运算。但是我们知道,计算机中整数的范围是有限的,这时候,我们就需要用到所谓的高精度运算。 通俗地讲,高精度运算就是用一个数组来表示整数,用模拟人解竖式的方法进行计算。 用一个整型数组表示一个数,其中数组的每一个元素表示数的一位。第一个元素表示个位,第二个元素表示十位,以此类推。另外还需要一个变量来存放这个数的长度,通常把这个长度存放在数组下标为0的元素中。 多余的元素要设成0。
高精度加法 从个位开始,依次相加。注意进位。 两个数相加,和的长度有可能大于其中任何一个数,因此要注意最后正确设置和的长度。 A[i]=a[i]+b[i],若a[i]>9 则 dec(a[i],10), inc(a[I+1]); 17532+2349=19881 17532 + 2349 -------------- 19881
program gjdplus(input,output); var st:string;
x,y:array[0..101]of integer; i,j,l1,l2:integer; begin
assign(input,'gjdplus.in'); reset(input); readln(st);
fillchar(x,sizeof(x),0); fillchar(y,sizeof(y),0); l1:=length(st);
for i:=l1 downto 1 do
x[l1-i]:=ord(st[i])-ord('0'); readln(st); l2:=length(st);
for j:=l2 downto 1 do y[l2-j]:=ord(st[j])-ord('0'); close(input);
if l1 if x[i]>=10 then begin inc(x[i+1]); dec(x[i],10); end; end; while x[l1]<>0 do inc(l1); assign(output,'gjdplus.out'); rewrite(output); for i:=l1-1 downto 0 do write(x[i]); close(output); end. 高精度减法 从个位开始,依次相减。有借位时向上一位借位。 两个数相减,差的长度有可能小于其中任何一个数,因此要注意最后正确设置差的长度。 这里不考虑出现小数减大数的情况。 A[i]x,y:array[0..101]of integer; i,j,l1,l2:integer; begin assign(input,'gjdplus.in'); reset(input); readln(st); fillchar(x,sizeof(x),0); fillchar(y,sizeof(y),0); l1:=length(st); for i:=l1 downto 1 do x[l1-i]:=ord(st[i])-ord('0'); readln(st); l2:=length(st); for j:=l2 downto 1 do y[l2-j]:=ord(st[j])-ord('0'); close(input); for i:=0 to l1 do begin if x[i] x[i]:=x[i]-y[i]; end; while (x[l1]=0)and(l1>0) do dec(l1); assign(output,'gjdplus.out'); rewrite(output); for i:=l1 downto 0 do write(x[i]); close(output); end. 第29课 高精度乘法 乘法相对来说要麻烦一些,但其本质思想仍然是一样的。 注意:乘法在累加的时候,进位可能大于1。因此要采用不同的进位方法。 532*349=185668 532 * 349 -------------- 4788 2128 1596 -------------- 185668 program gjdj(input,output); var st:string; x,y,c:array[0..101]of integer; i,j,temp,l1,l2,l3,k:integer; begin readln(st); l1:=length(st); for i:=l1 downto 1 do x[l1-i+1]:=ord(st[i])-ord('0'); readln(st); l2:=length(st); for j:=l2 downto 1 do y[l2-j+1]:=ord(st[j])-ord('0'); close(input); for j:=1 to l2 do for i:=1 to l1 do begin inc(c[i+j-1],x[i]*y[j]); inc(c[i+j],c[i+j-1]div 10); c[i+j-1]:=c[i+j-1] mod 10; end; k:=l1+l2+1; while (k>1) and (c[k]=0)do dec(k); assign(output,'gjdplus.out'); rewrite(output); for i:=k downto 1 do write(c[i]); close(output); end. 因篇幅问题不能全部显示,请点此查看更多更全内容