CBigInt005
Home ] Up ]

 

//file   CBigInt005.cpp
//date   02/02/2005
//author aou

#include <iostream>
using namespace std;

const int MAX_DIGITS = 50;
const int BASE       = 10;

class CBigInt
  {
  private:
    int  _base;
    char _sign;
    char _digits[MAX_DIGITS];
  //...
  public:
    CBigInt(void);//constructor/auto-initializer
    void display(void);
    void initialize(void);
    CBigInt(char s[]); //CBigInt bi("+12345");
    void input(void);
    bool isValid(char s[]);

    //add(a, b, c);
    //add(a, b);
    //add(b);
    //CBigInt abs(void);
    //CBigInt pow(int expo);
    //...
  };

void main(void)
  {
  CBigInt b;
  cout << "b = "; b.display();

  CBigInt a("667627001667627001667627001");
  cout << "a = "; a.display();

  CBigInt c("+667627001667627001667627001");
  cout << "c = "; c.display();

  CBigInt d("-667627001667627001667627001");
  cout << "d = "; d.display();

  CBigInt e("667-627001667627001667627001");
  cout << "e = "; e.display();

  a.input();
  cout << "a = "; a.display();


  //cin >> a; a.input();
  //cin >> b;
  //cin >> c;
  //c = a + b; add(a, b, c);
  //cout << c; c.display();
  }


bool CBigInt::isValid(char s[])
  {
  /*
  check if s has a valid integer
  possibilities:
    first character is +, -, or a digit 0 to 9
    rest of the characters should be 0 to 9

  Algorithm0:
    if s[0] is not a digit or + or - then 
      return false
    else
      if rest of the digits are not 0 to 9 then 
        return false
      else
        return true

  Algorithm1:
    if (s[0] is not a digit) and (s[0] <> '+') and (s[0]<>'-') then 
      return false
    else
      if rest of the digits are not 0 to 9 then 
        return false
      else
        return true


  Algorithm2:
    if ((s[0]<'0' or s[0]>'9') and (s[0] <> '+') and (s[0]<>'- ') then 
      return false
    else
      for i=1 to strlen(s)-1
        if s[i] is not 0 to 9 then 
          return false
        end for
      return true

  */
  if ((s[0]<'0' || s[0]>'9') && (s[0] != '+') && (s[0] != '-'))  
    return false;
  else
    {
    for (int i=1; i<=strlen(s)-1; i++)
      if (s[i]<'0' || s[i]>'9')
        return false;

    return true;
    }
  }


void CBigInt::input(void)
  {
  char s[MAX_DIGITS+2];
  cin >> s;

  initialize();

  if (!isValid(s))
    return;

  /*
  if (s[0] == '-')
    _sign = '-';
  else
    _sign = '+';
  */
  _sign = '+';
  /*
  j = MAX_DIGITS-1
  for i = length(s)-1 to 0
    digits[j] = s[i]
    j--
    end for
  */
  int j = MAX_DIGITS-1;
  for (int i = strlen(s)-1; i>=0; i--)
    {
    _digits[j] = s[i];
    j--;
    }

  }


CBigInt::CBigInt(char s[])
  {
  initialize();

  if (!isValid(s))
    return;


  /*
  if (s[0] == '-')
    _sign = '-';
  else
    _sign = '+';
  */
  _sign = '+';
  /*
  j = MAX_DIGITS-1
  for i = length(s)-1 to 0
    digits[j] = s[i]
    j--
    end for
  */
  int j = MAX_DIGITS-1;
  for (int i = strlen(s)-1; i>=0; i--)
    {
    _digits[j] = s[i];
    j--;
    }
  }


void CBigInt::display(void)
  {
  cout << _sign;
  for (int i=0; i<=MAX_DIGITS-1; i++)
    cout << _digits[i];

  cout << '[' << _base << "]\n";
  }


void CBigInt::initialize(void)
  {
  _base = BASE;
  _sign = '+';
  for (int i=0; i<=MAX_DIGITS-1; i++)
    _digits[i] = '0';
  }


CBigInt::CBigInt(void)
  {
  initialize();
  //_base = BASE;
  //_sign = '+';
  //for (int i=0; i<=MAX_DIGITS-1; i++)
  //  _digits[i] = '0';
  }

/*
Output:
b = +00000000000000000000000000000000000000000000000000[10]
a = +00000000000000000000000667627001667627001667627001[10]
c = +0000000000000000000000+667627001667627001667627001[10]
d = +0000000000000000000000-667627001667627001667627001[10]
e = +00000000000000000000000000000000000000000000000000[10]
123
a = +00000000000000000000000000000000000000000000000123[10]
Press any key to continue
*/