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