#include #include void lcala(long *); void lcalb(long *); void ladd(long *,long *,long *); void lsub(long *,long *,long *); void ldiva(long *); void ldivb(long *,long,long *); void printresult(long *); #define L 65536 #define L1 ((L/9)+1) #define L2 (L1+1) #define N1 (L/1.39794+1) #define N2 (L/4.75679+1) void main(void){ long k; static long s[L2+2],sw[L2+2],sv[L2+2]; for(k=0;k<=L2;k++) s[k]=sw[k]=sv[k]=0; lcala(sw); lcalb(sv); lsub(sw,sv,s); printresult(s); } void lcala(long d[]){ long k,w[L2+2],qw[L2+2]; for(k=0;k<=L2;k++) w[k]=qw[k]=0; w[0]=16*5; for(k=1;k<=N1;k++){ ldiva(w); ldivb(w,2*k-1,qw); if((k%2)!=0) ladd(d,qw,d); else lsub(d,qw,d); } } void lcalb(long d[]){ long k,w[L2+2],qw[L2+2]; for(k=0;k<=L2;k++) w[k]=qw[k]=0; w[0]=4*239; for(k=1;k<=N2;k++){ ldivb(w,57121,w); ldivb(w,2*k-1,qw); if((k%2)!=0) ladd(d,qw,d); else lsub(d,qw,d); } } void printresult(long c[]) { long i,j,x=1; static long p[L2*9+2]; for(i=1;i<=L2;i++){ for(j=8;j>=0;j--){ p[x]=c[i]/pow(10,j); p[x]%=10; x++; } } printf("PI=%d.\n\n",c[0]); for(i=1;i<=L;i++){ printf("%d",p[i]); if(i%1000==0) printf("\n\n"); else if(i%50==0) printf("\n"); else if(i%10==0) printf(" "); } printf("\n"); } void ladd(long a[],long b[],long c[]) { long i,cy=0; for(i=L2;i>=0;i--){ c[i]=a[i]+b[i]+cy; if(c[i]<1000000000) cy=0; else{ c[i]-=1000000000; cy=1; } } } void lsub(long a[],long b[],long c[]) { long i,brrw=0; for(i=L2;i>=0;i--){ c[i]=a[i]-b[i]-brrw; if(c[i]>=0) brrw=0; else{ c[i]+=1000000000; brrw=1; } } } void ldiva(long a[]) { long i,tr1=0,tr2=L2;double d,rem=0; while(a[tr1]==0){ tr1++; } while(a[tr2]==0){ tr2--; } for(i=tr1;i<=tr2+1;i++){ d=a[i]+rem; a[i]=d/25; rem=(d-(double)a[i]*25)*1000000000; } } void ldivb(long a[],long b,long c[]) { long i,tr=0;double d,rem=0; while(a[tr]==0){ c[tr]=0; tr++; } for(i=tr;i<=L2;i++){ d=a[i]+rem; c[i]=d/b; rem=(d-(double)c[i]*b)*1000000000; } }