Click here to Skip to main content
6,291,722 members and growing! (14,645 online)
Email Password   helpLost your password?
Languages » C / C++ Language » General     Intermediate License: The Microsoft Public License (Ms-PL)

A class for operations with Large Integer Numbers

By George Anescu

Presenting some algorithms for operations with large integer numbers in a C++ class using the STL vector container
VC6Win2K, STL, Dev
Posted:15 Jun 2001
Updated:26 May 2003
Views:66,575
Bookmarked:32 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
20 votes for this article.
Popularity: 5.20 Rating: 4.00 out of 5
2 votes, 18.2%
1

2

3
2 votes, 18.2%
4
7 votes, 63.6%
5

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, 
vector<char>& rvNRes); //Subtraction static void Subtract(vector<char> const& rcvN1, vector<char> const& rcvN2,
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,
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


Member

Occupation: Web Developer
Location: Romania Romania

Other popular C / C++ Language articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 10 of 10 (Total in Forum: 10) (Refresh)FirstPrevNext
GeneralBug? PinmemberSamo Jemec23:45 14 Mar '06  
GeneralRe: Bug? PinmemberSamo Jemec4:40 15 Mar '06  
GeneralThanks Pinmemberomermedan3:03 14 Oct '05  
GeneralThank you very very much!! PinsussAnonymous3:54 7 Apr '05  
GeneralCode Usage Pinmembermail@pdjohnson.com19:18 28 Feb '05  
GeneralCool PinmemberG Poulose7:14 25 Sep '04  
Generalboost::operators PinmemberJonathan de Halleux21:32 27 May '03  
GeneralCLargeNumber += doesn't work !!!!! Pinmemberdanlemas23:53 25 May '03  
GeneralRe: CLargeNumber += doesn't work !!!!! PinmemberGeorge Anescu6:20 27 May '03  
GeneralTwo Quick additions PinmemberJames Curran8:14 18 Jun '01  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 26 May 2003
Editor: Chris Maunder
Copyright 2001 by George Anescu
Everything else Copyright © CodeProject, 1999-2009
Web12 | Advertise on the Code Project