|
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.
|