#include #include void lcala(long *); void lcalb(long,long,long,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/2+1) #define N2 (L/4.75679+1) #define N3 (L/5.42361+1) void main(void){ long k; static long s[L2+2],s1[L2+2],s2[L2+2],s3[L2+2]; for(k=0;k<=L2;k++) s[k]=s1[k]=s2[k]=0; lcala(s1); lcalb( 4*239,N2, 57121,s2); lcalb(16*515,N3,265225,s3); lsub(s1,s2,s); lsub( s,s3,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]=32*10; 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 a,long b,long c,long d[]){ long k,w[L2+2],qw[L2+2]; for(k=0;k<=L2;k++) w[k]=qw[k]=0; w[0]=a; for(k=1;k<=b;k++){ ldivb(w, c,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 tr=0,rem; while(a[tr]==0){ tr++; } rem=a[tr]%100; a[tr]/=100; if(rem==0){ ; } else if(rem==20){ a[tr+1]=200000000; } else if(rem==32){ a[tr+1]=320000000; } else if(rem==3){ a[tr+1]=32000000; } } 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; } }