#include <stdio.h>
#include <math.h>

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;
	}
}

–ß‚é