高精度乘法

高精数*普通数

分析
乘法运算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 1010        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.

 

posted @ 2016-02-01 20:34  ZJQCation  阅读(327)  评论(0编辑  收藏  举报