Click here to Skip to main content
Click here to Skip to main content

A class for operations with Large Integer Numbers

By , 26 May 2003
 

The full code of the class is contained in the article's associated project LargeNumber.zip. Here I present only the interface of the class:

class CLargeNumber
{
public:
  //Default Constructor
  CLargeNumber() : m_cSign(1) { m_oNumber.push_back(0); }

  //Copy Constructor - Default OK
  //CLargeNumber(CLargeNumber const& rcoLargeNumber) : 
  //	m_cSign(rcoLargeNumber.m_cSign), m_oNumber(rcoLargeNumber.m_oNumber) {}

  //Constructor From a Number
  CLargeNumber(int iNumber);
  //Constructor From a String
  CLargeNumber(string const& rostrNumber);
  //Constructor From Members
  CLargeNumber(char cSign, vector<char> const& rcoNumber) : 
  	m_cSign(cSign), m_oNumber(rcoNumber) {}

  //Assignment Operator - Default OK
  //CLargeNumber& operator=(CLargeNumber const& roLN);

protected:
  //Auxiliary class Functions:
  //Build from unsigned long
  static void Build(unsigned uN, vector<char>& rvN);
  //Build from string
  static void Build(string const& rostrNumber, vector<char>& rvN);
  //Cleaning
  static void Clean(vector<char>& rvN);
  //Comparison Function
  static int Compare(vector<char> const& rcvN1, vector<char> const& rcvN2);
  //Addition
  static void Add(vector<char> const& rcvN1, vector<char> const& rcvN2, <BR>                  vector<char>& rvNRes);
  //Subtraction
  static void Subtract(vector<char> const& rcvN1, vector<char> const& rcvN2, <BR>                       vector<char>& rvNRes);
  //Product with one digit
  static void Multiply(vector<char> const& rcvN, char c, vector<char>& rvNRes);
  //Shift Left
  static void ShiftLeft(vector<char>& rvN, int iLeft);
  //Multiplication
  static void Multiply(vector<char> const& rcvN1, vector<char> const& rcvN2, <BR>                       vector<char>& rvNRes);
  //Get the Position of the most significant Digit
  static int Position(vector<char> const& rcvN);
  //Compute a Power of 10
  static void Pow10(unsigned uPow, vector<char>& rvNRes);
  //Division
  static void Divide(vector<char> const& rcvN1, vector<char> const& rcvN2, 
                     vector<char>& rvQ, vector<char>& rvR);

public:
  //Transform to a string
  string ToString() const;
  //Operators
  //Equality Operator
  bool operator==(CLargeNumber const& roLN);
  //Inequality Operator
  bool operator!=(CLargeNumber const& roLN);
  CLargeNumber& operator-();
  bool operator<(CLargeNumber const& roLN) const;
  bool operator>(CLargeNumber const& roLN) const;
  bool operator<=(CLargeNumber const& roLN) const;
  bool operator>=(CLargeNumber const& roLN) const;
  CLargeNumber operator+(CLargeNumber const& roLN) const;
  CLargeNumber operator-(CLargeNumber const& roLN) const;
  CLargeNumber operator*(CLargeNumber const& roLN) const;
  CLargeNumber operator/(CLargeNumber const& roLN) const;
  CLargeNumber operator%(CLargeNumber const& roLN) const;
  CLargeNumber& operator+=(CLargeNumber const& roLN);
  CLargeNumber& operator-=(CLargeNumber const& roLN);
  CLargeNumber& operator*=(CLargeNumber const& roLN);
  CLargeNumber& operator/=(CLargeNumber const& roLN);
  CLargeNumber& operator%=(CLargeNumber const& roLN);
  //Convertion operator
  operator int() const;
  //Square Root
  CLargeNumber SquareRoot() const;

private:
  //-1 - Negative, +1 - Positive or zero
  char m_cSign;
  vector<char> m_oNumber;
};

I am using the STL vector<char> container m_oNumber to keep the decimal digits of the number. The digits are stored in the order from lowest to highest. The sign of the number is kept in the char m_cSign field. The operations for positive large numbers are implemented in some auxiliary static functions. I prefered to use static functions because these auxiliary functions are not dependent on the class's field members. The operations for signed large numbers are implemented using extensive operator overloading and are using internally the auxiliary static functions. Some examples of how to use the class:

Addition

CLargeNumber oLN1("1111111434311111");
CLargeNumber oLN2("2222222233422222");
cout << (oLN1+oLN2).ToString() << endl;

Subtraction

CLargeNumber oLN1("12323523664");
CLargeNumber oLN2("325454361234");
cout << (oLN1-oLN2).ToString() << endl;

Multiplication

CLargeNumber oLN1("123456834333466");
CLargeNumber oLN2(1000);
cout << (oLN1*oLN2).ToString() << endl;

Division

This will throw an exception for division by 0

try
{
  CLargeNumber oLN1("1234655123667");
  CLargeNumber oLN2(500);
  cout << (oLN1/oLN2).ToString() << endl;
  cout << (oLN1%oLN2).ToString() << endl;
}
catch(exception& roEx)
{
  cout << roEx.what() << endl;
}

Square Root

This will throw an exception for negative numbers

try
{
  CLargeNumber oLN1("1000000000000000000");
  cout << oLN1.SquareRoot().ToString() << endl;
}
catch(exception& roEx)
{
  cout << roEx.what() << endl;
}

Factorial

In the testing program I also have implemented a small function for factorial calculation:

CLargeNumber Factorial(int iNumber)
{
  CLargeNumber oLN("1");
  if(iNumber > 1)
  {
    for(int i=2; i<=iNumber; i++)
      oLN *= i;
  }
  return oLN;
}

Example

As an example I give the 158 digits of 100!:

9332621544394415268169923885626670049071596826438162146859296389521759999322991
5608941463976156518286253697920827223758251185210916864000000000000000000000000

I hope you will have some fun playing with this class!

License

This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)

About the Author

George Anescu
Web Developer
Romania Romania
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionWhy doesn't work some operations ???memberPahanuch28 Nov '12 - 3:39 
QuestionProblemmembermheese26 Mar '12 - 11:42 
GeneralMultumesc mult!membergeorge schiopu17 May '10 - 11:38 
GeneralINT_MIN INT_MAX error [modified]memberErick Birbe26 Jul '09 - 10:01 
QuestionBug?memberSamo Jemec14 Mar '06 - 22:45 
AnswerRe: Bug?memberSamo Jemec15 Mar '06 - 3:40 
GeneralThanksmemberomermedan14 Oct '05 - 2:03 
GeneralThank you very very much!!sussAnonymous7 Apr '05 - 2:54 
GeneralCode Usagemembermail@pdjohnson.com28 Feb '05 - 18:18 
GeneralCoolmemberG Poulose25 Sep '04 - 6:14 
Generalboost::operatorsmemberJonathan de Halleux27 May '03 - 20:32 
GeneralCLargeNumber += doesn't work !!!!!memberdanlemas25 May '03 - 22:53 
GeneralRe: CLargeNumber += doesn't work !!!!!memberGeorge Anescu27 May '03 - 5:20 
GeneralTwo Quick additionsmemberJames Curran18 Jun '01 - 7:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 27 May 2003
Article Copyright 2001 by George Anescu
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid