#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;
}
}
–ß‚é