高精度乘法
高精数*普通数
分析:
乘法运算a←a*c(a为高精度类型,c为字节型)
按照乘法规则,从a的第1位开始逐位与c相乘。在第i位乘法运算中(1≤i≤la),a的i位与c的乘积必须加上i-1位的进位(i-1位的乘积除以10的整商),然后规整积的i-1位(取i-1位的乘积对10的余数)。
1 procedure multiply(var a:numtype; c:byte); 2 var 3 i:byte; 4 begin 5 a[1] ←a[1]*c; {第1位初始化} 6 for i←2 to la do {逐位相乘} 7 begin 8 a[i] ←a[i]*c; 9 a[i] ←a[i]+a[i-1] div 10; 10 a[i-1] ←a[i-1] mod 10 11 end:{for} 12 while a[la]>=10 do {积的最高位进位} 13 begin 14 la←la+1; 15 a[la] ←a[la-1] div 10; 16 a[la-1] ←a[la-1]mod 10; 17 end; {while} 18 end;{multiply}
高精数*高精数
分析:乘法运算c←a*b(a,b为高精度类型),类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位乘法运算时,必须进行错位相加,如图3, 图4。
分析C 数组下标的变化规律,可以写出如下关系式:C i = C 'i +C ''i +…由此可见,C i跟A[i]*B[j]乘积有关,跟上次的进位有关,还跟原C i的值有关,分析下标规律,有
C[i+j-1]:= A[i]*B[j]+ x + C[i+j-1]; {当前乘积+上次乘积进位+原数}
x:= C[i+j-1] div 10; {进位}
C[i+j-1]:= C[i+j-1] mod 10 {乘积值}
1 const 2 max=200; 3 var 4 a,b,c:array[1..max] of 0..9; 5 n1,n2:string; 6 lena,lenb,lenc,i,j,x:integer; 7 begin 8 readln(n1); 9 readln(n2); 10 lena:=length(n1); lenb:=length(n2); 11 for i:=1 to lena do a[lena-i+1]:=ord(n1[i])-ord(’0’); 12 for i:=1 to lenb do b[lenb-i+1]:=ord(n2[i])-ord(’0’); 13 for i:=1 to lena do 14 begin 15 x:=0; {用于存放进位} 16 for j:=1 to lenb do 17 begin {对乘数的每一位进行处理} 18 C[i+j-1]:= A[i]*B[j]+ x + C[i+j-1]; {当前乘积+上次乘积进位+原数} 19 x:= C[i+j-1] div 10; 20 C[i+j-1]:= C[i+j-1] mod 10 21 end; 22 c[i+j]:= x; {进位} 23 end; 24 lenc:=i+j; 25 while (c[lenc]=0) and (lenc>1) do dec(lenc); 26 for i:=lenc downto 1 do write(c[i]); 27 end.