内容目录
卡特兰数三大公式
C(n)=C(n-1)*(4*n-2)/(n+1)
C(n)=C(2n-1,n+1)-C(2n-1,n-1)
C(n)=C(2n,n)/(n+1)
Program p2084; Const F=10000; Type arr=record a:array[1..10000] of longint; len:longint; end; var n,i,j:longint; c:array[1..101] of arr; Procedure Mulpily(a:arr;b:longint;var c:arr); var i,j:longint; begin fillchar(c,sizeof(c),0); for i:=1 to a.len do begin inc(c.a[i],a.a[i]*b); inc(c.a[i+1],c.a[i] div F); c.a[i]:=c.a[i] mod F; end; c.len:=a.len; while c.a[c.len+1]>0 do begin inc(c.len); inc(c.a[c.len+1],c.a[c.len] div F); c.a[c.len]:=c.a[c.len] mod F; end; while (c.len>1) and (c.a[c.len]=0) do dec(c.len); end; Procedure Divede(a:arr;b:longint;var c:arr); var i,j,d:longint; begin fillchar(c,sizeof(c),0); d:=0; for i:=a.len downto 1 do begin d:=d*F+a.a[i]; c.a[i]:=d div b; d:=d mod b; end; c.len:=a.len; while (c.len>1) and (c.a[c.len]=0) do dec(c.len); end; Procedure prin(a:arr); var i,j:longint; begin write(a.a[a.len]); for i:=a.len-1 downto 1 do begin if a.a[i]<1000 then write('0'); if a.a[i]<100 then write('0'); if a.a[i]<10 then write('0'); write(a.a[i]); end; writeln; end; begin fillchar(c,sizeof(c),0); c[1].len:=1; c[1].a[1]:=1; c[2].len:=1; c[2].a[1]:=1; for i:=3 to 101 do begin Mulpily(c[i-1],4*i-2,c[i]); divede(c[i],i+1,c[i]); end; read(n); while (n<>-1) do begin prin(c[n+1]); read(n); end; end.