1、计算sqrt(2) 利用公式:1/sqrt(1-x)=1 + 1/2*x + 1*3/(2*4)*x^2 + (1*3*5)/(2*4*6)*x^3 + …… 当x=1/57122时,代入左边算算得到什么数。Sqrt(2)前多一个系数没关系,最后做一步简单的系数乘除就行了。 选择x=1/57122,是为了让级数收敛更快些。当然,选1/50、1/1682 也是可以的,慢一点而已。 program sqrt_2; label ext; const dn=2504; var i,k:longint; sum,a:array[1..dn] of integer; ip:integer; procedure outp; var i,m:integer; procedure testm; begin if m mod 10=0 then write(' '); if (m mod 50=0) and (m mod 1000<>0) then writeln(':',m:8); if m mod 1000<>0 then exit; writeln(':',m:8,' Press Enter..'); readln; end; procedure writep(num:integer); begin write(num div 1000); m:=m+1; testm; write(num div 100 mod 10); m:=m+1; testm; write(num div 10 mod 10); m:=m+1; testm; write(num mod 10); m:=m+1; testm; end; begin writeln('sqrt(2)='); writeln(sum[1],'.'); m:=0; for i:=2 to dn do writep(sum[i]) ; writeln; writeln('Programmed by j.t.chang'); end; procedure m_div(k:longint); var i:integer; r1,c:longint; begin c:=0; for i:=ip to dn do begin r1:=c*10000+a[i]; a[i]:=r1 div k; c:=r1 mod k; end; end; procedure sm_div(k:longint); var i:integer; r1,c:longint; begin c:=0; for i:=1 to dn do begin r1:=c*10000+sum[i]; sum[i]:=r1 div k; c:=r1 mod k; end; end; procedure m_mul(k:longint); var i:integer; r1,c:longint; begin c:=0; for i:=dn downto ip do begin r1:=k*a[i]+c; a[i]:=r1 mod 10000; c:=r1 div 10000; end; if ip=1 then begin a[1]:=c; exit; end; i:=ip-1; while c>0 do begin if i=1 then begin a[1]:=c; exit end; a[i]:=c mod 10000; c:=c div 10000; i:=i-1; end; end; procedure sm_mul(k:longint); var i:integer; r1,c:longint; begin c:=0; for i:=dn downto 2 do begin r1:=k*sum[i]+c; sum[i]:=r1 mod 10000; c:=r1 div 10000; end; r1:=1; r1:=r1*k*sum[1]+c; sum[1]:=r1 ; end; procedure m_add; var i:integer; c:longint; begin c:=0; for i:=dn downto 1 do begin sum[i]:=sum[i]+a[i]+c; if sum[i]>=10000 then begin c:=sum[i] div 10000; sum[i]:=sum[i] mod 10000; end else c:=0; end; end; begin writeln('Please wait...'); for i:=1 to dn do a[i]:=0; a[1]:=1; sum:=a; k:=1; ip:=1; repeat i:=ip; while (a[i]=0) do begin i:=i+1; if i>dn then goto ext; end; ip:=i; m_div(2*k); m_mul(2*k-1); m_div(57122); m_add; k:=k+1; until false; ext: sm_div(169); sm_mul(239); outp; end. 2、计算黄金分割 黄金分割= ( sqrt(5)-1 )/2 其实把sqrt(5)算出来就解决了。只要修改以上主程序最后几句: m_div(57122); 这句修改为两句:m_div(39605); m_mul(4); sm_div(169); 修改为:sm_div(89); sm_mul(239); 这句修改为三句:sm_mul(199); sum[1]:=sum[1]-1; sm_div(2); 运行后,得到黄金分割的数值为0.6180339887……小数点后一万个数位。

评论