|| 返回 || 本站首页 ||奥赛信息||计算机基础||pascal基础||数据结构||经典算法||试题汇编||校本教程||自主练习||

|| 经典算法 >> 高精度阶乘

双击自动滚屏 

   

高精度阶乘



 

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.


 
 

 

 
 
 

制作与维护:重庆市忠县中学 谭海