#include <string.h>
/*
PI/2 = 1 + (1/3) + (1/3)*(2/5) + (1/3)*(2/5)*(3/7) + (1/3)*(2/5)*(3/7)*(4/9) + ...
double x=2, z=2;
int a=1, b=3;
while(z>1e-15)
{
z = z*a/b;
x += z;
a++;
b+=2;
}
*/
#define PI_WEI_COUNT 1000
#define ARRSIZE (PI_WEI_COUNT + (PI_WEI_COUNT/100))
void CalPI(void)
{
char x[ARRSIZE], z[ARRSIZE];
int a=1, b=3, c, d, Run=1, Cnt=0;
int i;
memset(x,0,ARRSIZE);
memset(z,0,ARRSIZE);
x[1] = 2;
z[1] = 2;
while(Run && (++Cnt < 200000000)) {
/* z*=a; */
d = 0;
for(i=ARRSIZE-1; i>0; i--) {
c = z[i]*a + d;
z[i] = c % 10;
d = c / 10;
}
/* z/=b; */
d = 0;
for(i=0; i<ARRSIZE; i++) {
c = z[i]+d*10;
z[i] = c / b;
d = c % b;
}
/* x+=z; */
Run = 0;
for(i=ARRSIZE-1; i>0; i--) {
c = x[i] + z[i];
x[i] = c%10;
x[i-1] += c/10;
Run |= z[i];
}
a++;
b+=2;
}
printf("Cal %d times:", Cnt);
for(i = 0; i < PI_WEI_COUNT; i++) {
x[i] += '0';
}
x[i] = '\0';
printf("%s", x);
printf("\n");
}