2007-08-22

    高精度阶乘 - [Algorithms]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://conoon.blogbus.com/logs/7858296.html

    program jjzx;  {本程序最大限制为求N(N<999)的阶乘}
    var
      a,b,c:array[1..1000] of integer; 
      i,j,l,m,k1,k2,x,y,z,w,n,t:integer;


      procedure chengfa;  {高精度乘法}
        begin
           for l:=1 to k1 do
             for m:=1 to k2 do
                begin
                   x:=a[l]*b[m];  
                   y:=x div 10;
                   z:=x mod 10;
                   w:=l+m-1;
                   c[w]:=c[w]+z;  
                   c[w+1]:=c[w+1]+y+c[w] div 10;
                   c[w]:=c[w]mod 10
                end;
           k1:=k1+k2;  {位数为K1、K2的两数相乘最大只有K1+K2位}
           if c[k1]=0 then k1:=k1-1;  {如果最高位为0则位数减少一位}
           for t:=1 to k1 do a[t]:=c[t];  {把一次高精度相乘的结果放到A数组中,以便下次相乘}
           for t:=1 to k1 do c[t]:=0;     {同时把数组C清空,以便下次相乘,因为每调用此过程一次都是一次                                       全新的高精度乘法,所以数组C必须清空}
       end;

      procedure zhuanhuan;  {把I每一位分解开分别赋值给数组B的每一个元素}
         begin
           if i>=100 then
             begin
               k2:=3;
               b[3]:=i div 100;
               b[2]:=(i-b[3]*100) div 10;
               b[1]:=i-b[3]*100-b[2]*10
             end
           else
             if i>=10
               then
                  begin
                    k2:=2;
                    b[2]:=i div 10;
                    b[1]:=i-b[2]*10
                  end
               else
                   begin
                    k2:=1;
                    b[1]:=i
                   end;
         end;

    begin
      writeln('input:');
      readln(n);
      a[1]:=1;  {最后结果放在数组A中}
      k1:=1;
      for i:=2 to n do
        begin
          zhuanhuan;
          chengfa;
        end;
     writeln(n:2,'!= ');
     for i:=k1 downto 1 do write(a[i])
    end.


    随机文章:

    穿越迷宫 2007-08-22
    高精度乘法 2007-08-22

    收藏到:Del.icio.us




    Tag:
    引用地址:

发表评论

您将收到博主的回复邮件
记住我