#include <stdio.h>
#include <stdlib.h>

#define false 0
#define true 1

int *p;
int *t;
int q;

void add()
{
  int j;

  for (j = q; j >= 0; j--)
    if (t[j] + p[j] > 9)
    {
      p[j] += t[j] - 10;
      p[j-1] += 1;
    }
    else
      p[j] += t[j];
}

void sub()
{
  int j;

  for (j = q; j >= 0; j--)
    if (p[j] < t[j])
    {
      p[j] -= t[j] -10;
      p[j-1] -= 1;
    }
    else
      p[j] -= t[j];
}

void mul(int multiplier)
{
  int b, i, carry, digit;

  carry = 0;
  for (i = q; i >= 0; i--)
  {
    b = (t[i] * multiplier + carry);
    digit = b % 10;
    carry = b / 10;
    t[i] = digit;
  }
}

void divide(int divisor)
{
  int i, b, quotient, remainder;

  remainder = 0;
  for (i = 0; i <= q; i++)
  {
    b = (10 * remainder + t[i]);
    quotient = b / divisor;
    remainder = b % divisor;
    t[i] = quotient;
  }
}

void div4()
{
  int i, c, d;

  d = 0;
  for (i = 0; i <= q; i++)
  {
    c = (10 * d + p[i]) / 4;
    d = (10 * d + p[i]) % 4;
    p[i] = c;
  }
}

void mul4()
{
  int i, c, d;

  c = 0;
  for (i = q; i >= 0; i--)
  {
    d = (p[i] * 4 + c) % 10;
    c = (p[i] * 4 + c) / 10;
    p[i] = d;
  }
}

int tiszero()
{
  int k;

  for (k = 0; k <= q; k++)
    if (t[k] != 0)
      return false;
  return true;
}

void arctan(int s)
{
  int n;

  t[0] = 1;
  divide(s);
  add();
  n = 1;
  do
  {
    mul(n);
    divide(s * s);
    divide(n += 2);
    if (((n-1) / 2) % 2 == 0)
      add();
    else
      sub();
  } while (!tiszero());
}

//---------------------------------------------------------------------------
int main(int argc, char **argv)
{
    int n;

    // Check the arguments
    if (argc < 2)
      printf("usage: pi <precision>\n");
    else
    {
      // create the class
      q = atoi(argv[1]);
      p = 0;
      t = 0;
      p = (int*)calloc(q+1, sizeof(int));
      t = (int*)calloc(q+1, sizeof(int));

      // Compute PI
      arctan(2);
      arctan(3);
      mul4();

      printf("pi = %d.", p[0]);
      for (n = 1; n < q; n++)
        printf("%d", p[n]);
      printf("\n");

      free(t);
      free(p);
    }
    return 0;
}

