Created
September 12, 2014 16:51
-
-
Save jonpryor/fb8535405f89f2d79932 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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