Skip to content

Instantly share code, notes, and snippets.

@jonpryor
Created September 12, 2014 16:51
Show Gist options
  • Select an option

  • Save jonpryor/fb8535405f89f2d79932 to your computer and use it in GitHub Desktop.

Select an option

Save jonpryor/fb8535405f89f2d79932 to your computer and use it in GitHub Desktop.
#include <vector>
#include <string>
#include <iostream>
using namespace std;
class BigNumber
{
private:
vector<int> v;
vector<int> Add(vector<int>& A, vector<int>& B)
{
vector<int> copy(A);
int i, t = 0;
for (i = 1; i <= copy[0] || i <= B[0] || t; i++, t /= 10)
copy[i] = (t += copy[i] + B[i]) % 10;
copy[0] = i - 1;
return copy;
}
vector<int> Multiply(vector<int>& A, int B)
{
vector<int> copy(A);
int i, t = 0;
for (i = 1; i <= copy[0] || t; i++, t /= 10)
copy[i] = (t += copy[i] * B) % 10;
copy [0] = i - 1;
return copy;
}
vector<int> Multiply(vector<int>& A, vector<int>& B)
{
int i, j, t;
vector<int> C(A[0] * B[0] + 1);
for (i = 1; i <= A[0]; i++)
{
for (t=0, j=1; j <= B[0] || t; j++, t/=10)
C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
if (i + j - 2 > C[0]) C[0] = i + j - 2;
}
return C;
}
vector<int> Subtract(vector<int> &A, vector<int> &B)
{
vector <int> copy(A);
int i, t = 0;
for (i = 1; i <= copy[0]; i++) {
copy[i] -= ((i <= B[0]) ? B[i] : 0) + t;
copy[i] += (t = copy[i] < 0) * 10;
}
for (; copy[0] > 1 && !copy[copy[0]]; copy[0]--);
return copy;
}
vector<int> Divide(vector<int> &A, int B)
{
vector <int> copy(A);
int i, t = 0;
for (i = copy[0]; i > 0; i--, t %= B)
copy[i] = (t = t * 10 + copy[i]) / B;
for (; copy[0] > 1 && !copy[copy[0]]; copy[0]--);
return copy;
}
int Reminder(vector<int> A, int B)
{
int i, t = 0;
for (i = A[0]; i > 0; i--)
t = (t * 10 + A[i]) % B;
return t;
}
int cifre (int n)
{
int counter = 0;
while (n != 0)
{
++counter;
n /= 10;
}
return counter;
}
public:
BigNumber (string str)
{
v.push_back(str.size());
for (auto i = str.rbegin(); i != str.rend(); ++i)
v.push_back(*i - '0');
}
BigNumber (int n)
{
int size = cifre(n);
if (size == 0)
v.push_back(1);
v.push_back (size);
while (n != 0)
{
v.push_back(n % 10);
n /= 10;
}
}
BigNumber (const vector<int> &n, bool reversed = true)
{
if (reversed == true)
for (int i = 0; i <= n[0]; i++)
v.push_back(n[i]);
else
{
int size = n.size();
v.push_back(size);
for (auto i = n.rbegin(); i != n.rend(); ++i)
v.push_back(*i);
}
}
BigNumber (const BigNumber& other)
{
for (int i = 0; i <= other.v[0]; ++i)
v.push_back(other.v[i]);
}
BigNumber operator= (const BigNumber& other)
{
for (int i = 0; i <= other.v[0]; ++i)
v.push_back(other.v[i]);
return *this;
}
BigNumber operator+ (BigNumber other)
{
return Add(v, other.v);
}
BigNumber operator- (BigNumber other)
{
return Subtract(v, other.v);
}
BigNumber operator* (int n)
{
vector<int> answer = Multiply(v, n);
BigNumber result(answer);
return result;
}
BigNumber operator* (BigNumber other)
{
vector<int> answer = Multiply(v, other.v);
BigNumber result(answer);
return result;
}
BigNumber operator/ (int n)
{
return Divide (v, n);
}
BigNumber operator% (int m)
{
return Reminder(v, m);
}
bool operator== (const BigNumber& other)
{
if (v[0] != other.v[0])
return false;
bool equal = true;
for (unsigned int i = 0; i < (unsigned int)v[0]; ++i)
if (v[i] != other.v[i])
{
equal = false;
break;
}
return equal;
}
bool operator!= (const BigNumber& other)
{
return !operator==(other);
}
bool operator< (const BigNumber& other)
{
if (v[0] < other.v[0])
return true;
bool lesser = true;
for (int i = 0; i < v[0]; ++i)
if (v[i] > other.v[i])
{
lesser = false;
break;
}
return lesser;
}
bool operator> (const BigNumber& other)
{
return !operator<(other);
}
friend ostream& operator<<(ostream& out, const BigNumber& item);
};
ostream& operator<< (ostream& out, const BigNumber& item)
{
int size = item.v[0];
for(int i = size; i > 0; --i)
out << item.v[i];
return out;
}
int main()
{
BigNumber base = 4;
BigNumber exp = 13;
BigNumber zero = 0;
//BigNumber answ = Math::RiseToPower(base, exp);
BigNumber cinci(5);
//BigNumber answ = ((cinci * exp) * (cinci + zero));
BigNumber answ1 = ((base * exp) * (cinci * exp)); // works
cout << "answ1: " << answ1 << endl;
BigNumber answ2 = ((base * exp) * (cinci + exp)); // doesn't work
cout << "answ2: " << answ2 << endl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment