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

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

–ß‚é