$ cat bignum1.cpp

 

#include <stdio.h>

#include <stdlib.h>

 

int factorial(int n)

{ int answer=1;

  for (int i=1; i<=n; i+=1)

    answer*=i;

  return answer; }

 

void main(void)

{ for (int x=1; x<20; x+=1)

    printf("%3d! = %d\n", x, factorial(x)); }

 

$ CC bignum1.cpp

 

$ a.out

 

  1! = 1

  2! = 2

  3! = 6

  4! = 24

  5! = 120

  6! = 720

  7! = 5040

  8! = 40320

  9! = 362880

 10! = 3628800

 11! = 39916800

 12! = 479001600

 13! = 1932053504

 14! = 1278945280

 15! = 2004310016

 16! = 2004189184

 17! = -288522240

 18! = -898433024

 19! = 109641728

 


$ cat bignum2.cpp

 

#include <stdio.h>

#include <stdlib.h>

 

const int size=100;

 

struct bignum

{ int digit[size];

 

  bignum(int n)

  { for (int i=0; i<size; i+=1)

    { digit[i]=n%10;

      n=n/10; } }

 

  void print(void)

  { int firstdigit=0;

    for (int i=size-1; i>=0; i-=1)

      if (digit[i]!=0)

      { firstdigit=i;

        break; }

    for (int i=firstdigit; i>=0; i-=1)

      printf("%d", digit[i]); }

 

  void add(bignum b)

  { int carry=0;

    for (int i=0; i<size; i+=1)

    { int sum = digit[i] + b.digit[i] + carry;

      carry = sum/10;

      sum = sum - carry*10;

      digit[i] = sum; } }

 

  void multiply_by_int(int n)

  { int carry=0;

    for (int i=0; i<size; i+=1)

    { int prod = digit[i] * n + carry;

      carry = prod/10;

      prod = prod - carry*10;

      digit[i] = prod; } } };

 

bignum factorial(int n)

{ bignum answer(1);

  for (int i=1; i<=n; i+=1)

    answer.multiply_by_int(i);

  return answer; }

 

void main(void)

{ for (int x=1; x<20; x+=1)

  { printf("%3d! = ", x);

    bignum f = factorial(x);

    f.print();

    printf("\n"); } }

 


$ CC bignum.cpp

 

$ a.out

 

  1! = 1

  2! = 2

  3! = 6

  4! = 24

  5! = 120

  6! = 720

  7! = 5040

  8! = 40320

  9! = 362880

 10! = 3628800

 11! = 39916800

 12! = 479001600

 13! = 6227020800

 14! = 87178291200

 15! = 1307674368000

 16! = 20922789888000

 17! = 355687428096000

 18! = 6402373705728000

 19! = 121645100408832000

 

$


$ cat bignum3.cpp

 

#include <stdio.h>

#include <stdlib.h>

 

const int size=100;

   

struct bignum

{ int digit[size];  

     

  bignum(int n);

  void print(void);

  void add(bignum b);

  void multiply_by_int(int n); };

 

 

bignum::bignum(int n)

  { for (int i=0; i<size; i+=1)

    { digit[i]=n%10;

      n=n/10; } }  

     

void bignum::print(void)

  { int firstdigit=0;  

    for (int i=size-1; i>=0; i-=1)

      if (digit[i]!=0)

      { firstdigit=i;

        break; }

    for (int i=firstdigit; i>=0; i-=1)

      printf("%d", digit[i]); }

     

void bignum::add(bignum b)

  { int carry=0;

    for (int i=0; i<size; i+=1)

    { int sum = digit[i] + b.digit[i] + carry;

      carry = sum/10;

      sum = sum - carry*10;

      digit[i] = sum; } } 

     

void bignum::multiply_by_int(int n)

  { int carry=0;

    for (int i=0; i<size; i+=1)

    { int prod = digit[i] * n + carry;

      carry = prod/10;

      prod = prod - carry*10;

      digit[i] = prod; } }  

     

bignum factorial(int n)

{ bignum answer(1);

  for (int i=1; i<=n; i+=1)

    answer.multiply_by_int(i);

  return answer; }

 

void main(void)

{ for (int x=1; x<20; x+=1)

  { printf("%3d! = ", x); 

    bignum f = factorial(x);

    f.print();

    printf("\n"); } }