#include #include void lmul(long a[],long b,long c[]); void lbun(long a,long b[],long); void ladd(long *,long *,long *); void lsub(long *,long *,long *); void ldiv(long *,long,long); void ldiv19(long *,long,long); void printresult(long *); #define L 65536 #define L1 ((L/9)+1) #define L2 (L1+1) #define L3 (L2+2) #define N1 (L/3.51174+1) #define N2 (L/4.75679+1) #define N3 (L/5.66756+1) #define N4 (L/8.22406+1) void main(void){ static long k,b[L3],s[L3],s1[L3],s2[L3],s3[L3],s4[L3]; for(k=0;k<=L2;k++) b[k]=s[k]=s1[k]=s2[k]=s3[k]=s4[k]=0; for(k=N1;k>=1;k--){ lbun(2*k-1,b,L2+2-k*0.39019); // if(k<=N1){ lsub(b,s1,s1); ldiv(s1,3249,L2+2-k*0.39019); // } if(k<=N2){ lsub(b,s2,s2); ldiv(s2,57121,L2+2-k*0.52853); } if(k<=N3){ lsub(b,s3,s3); ldiv(s3,465124,L2+2-k*0.62972); } if(k<=N4){ lsub(b,s4,s4); ldiv19(s4,167521249,L2+2-k*0.913785544); } } lmul(s1, 176*57,s1);ladd(s,s1,s); lmul(s2, 28*239,s2);ladd(s,s2,s); lmul(s3, 48*682,s3);lsub(s,s3,s); lmul(s4,96*12943,s4);ladd(s,s4,s); printresult(s); } void lmul(long a[],long b,long c[]) { long i,cy=0;long double d; for(i=L2;i>=0;i--){ d=(long double)a[i]*b+cy; cy=d/1000000000; c[i]=d-(long double)cy*1000000000; } } 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 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 lbun(long a,long b[],long tr) { long i;double d,rem=1; for(i=0;i<=tr;i++){ d=rem; b[i]=d/a; rem=(d-(double)b[i]*a)*1000000000; } } void ldiv(long a[],long b,long tr) { long i;double d,rem=0; for(i=0;i<=tr;i++){ d=a[i]+rem; a[i]=d/b; rem=(d-(double)a[i]*b)*1000000000; } } void ldiv19(long a[],long b,long tr) { long i;long double d,rem=0; for(i=0;i<=tr;i++){ d=a[i]+rem; a[i]=d/b; rem=(d-(long double)a[i]*b)*1000000000; } }