Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- using namespace std;
- int getShortSize(const short& number)
- {
- int size = 0;
- int num = number;
- while (abs(num) > 0)
- {
- size++;
- num /= 10;
- }
- return size;
- }
- class Pair
- {
- long int* left;
- short int* right;
- unsigned int nZeros;
- public:
- Pair(long int A = 0, short int B = 0) : left(new long int(A)), right(new short int(B)), nZeros(0) {}
- Pair(const Pair& other)
- {
- nZeros = other.nZeros;
- left = new long int;
- *left = *other.left;
- right = new short int;
- *right = *other.right;
- }
- ~Pair() { delete left, right; }
- Pair& operator=(const Pair& other)
- {
- nZeros = other.nZeros;
- *left = *other.left;
- *right = *other.right;
- return *this;
- }
- Pair operator+(const Pair& other)
- {
- Pair tmp;
- short int tRightF, tRightS;
- tmp.left = new long int;
- tmp.right = new short int;
- if (getShortSize(*right) < getShortSize(*other.right))
- {
- tRightF = *right * pow(10, abs((getShortSize(*right) - getShortSize(*other.right))));
- tRightS = *other.right;
- }
- else if (getShortSize(*right) > getShortSize(*other.right))
- {
- tRightF = *right;
- tRightS = *other.right * pow(10, (getShortSize(*right) - getShortSize(*other.right)));
- }
- *tmp.left = *left + *other.left;
- *tmp.right = tRightF + tRightS;
- if (getShortSize(*tmp.right) > getShortSize(tRightF))
- {
- int power = getShortSize(tRightS);
- *tmp.left += *tmp.right / pow(10, power);
- *tmp.right = *tmp.right % int(pow(10, power));
- }
- tRightF = *tmp.right;
- while (tRightF != 0 && tRightF < pow(10, getShortSize(tRightS) - 1))
- {
- tmp.nZeros++;
- tRightF *= 10;
- }
- while (tRightF != 0 && *tmp.right % 10 == 0)
- *tmp.right /= 10;
- return tmp;
- }
- Pair operator-(const Pair& other)
- {
- Pair tmp;
- short int tRightF, tRightS;
- tmp.left = new long int;
- tmp.right = new short int;
- if (getShortSize(*right) < getShortSize(*other.right))
- {
- tRightF = *right * pow(10, abs((getShortSize(*right) - getShortSize(*other.right))));
- tRightS = *other.right;
- }
- else if (getShortSize(*right) > getShortSize(*other.right))
- {
- tRightF = *right;
- tRightS = *other.right * pow(10, (getShortSize(*right) - getShortSize(*other.right)));
- }
- if (other > * this)
- {
- *tmp.left = *other.left + *left;
- swap(tRightS, tRightF);
- if (tRightF >= tRightS)
- {
- *tmp.right = tRightF - tRightS;
- }
- else
- {
- *tmp.right = tRightF + 1000 - tRightS;
- *tmp.left -= 1;
- }
- tRightF = *tmp.right;
- while (tRightF != 0 && tRightF < pow(10, getShortSize(tRightS) - 1))
- {
- tmp.nZeros++;
- tRightF *= 10;
- }
- while (tRightF != 0 && *tmp.right % 10 == 0)
- *tmp.right /= 10;
- *tmp.left *= -1;
- }
- else
- {
- *tmp.left = *left + *other.left;
- if (tRightF >= tRightS)
- {
- *tmp.right = tRightF - tRightS;
- }
- else
- {
- *tmp.right = tRightF + 1000 - tRightS;
- *tmp.left -= 1;
- }
- tRightF = *tmp.right;
- while (tRightF != 0 && tRightF < pow(10, getShortSize(tRightS) - 1))
- {
- tmp.nZeros++;
- tRightF *= 10;
- }
- while (tRightF != 0 && *tmp.right % 10 == 0)
- *tmp.right /= 10;
- }
- return tmp;
- }
- Pair& operator *=(const int& multiplier)
- {
- *left *= multiplier;
- *right *= multiplier;
- return *this;
- }
- string toString()
- {
- string zeros;
- for (int i = 0; i < nZeros; i++)
- zeros += to_string(0);
- return string(to_string(*left) + '.' + zeros + to_string(*right));
- }
- friend ostream& operator<< (ostream&, const Pair&);
- friend istream& operator>> (istream&, Pair&);
- friend bool operator>= (const Pair& my, const Pair& other);
- friend bool operator<= (const Pair& my, const Pair& other);
- friend bool operator== (const Pair& my, const Pair& other);
- friend bool operator!= (const Pair& my, const Pair& other);
- friend bool operator> (const Pair& my, const Pair& other);
- friend bool operator< (const Pair& my, const Pair& other);
- };
- ostream& operator<< (ostream& out, const Pair& c)
- {
- out << "Число : " << to_string(*c.left) + "." + to_string(*c.right);
- return out;
- }
- istream& operator >> (istream& in, Pair& c)
- {
- cout << "Целая часть";
- in >> *c.left;
- cout << "Дробная часть";
- in >> *c.right;
- return in;
- }
- bool operator>= (const Pair& my, const Pair& other)
- {
- if (*my.left >= *other.left)
- return true;
- else if (*my.left == *other.left)
- {
- short int fRight = *my.right;
- short int sRight = *other.right;
- int power = int(pow(10, abs(getShortSize(*my.right) - getShortSize(*other.right))));
- if (getShortSize(fRight) <= getShortSize(sRight))
- {
- if (*my.right * power < *other.right)
- return false;
- else if (*my.right * power == *other.right)
- {
- if (my.nZeros >= other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- else
- {
- if (*my.right < *other.right * power)
- return false;
- else if (*my.right == *other.right * power)
- {
- if (my.nZeros >= other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- }
- else
- return false;
- }
- bool operator<= (const Pair& my, const Pair& other)
- {
- if (*my.left <= *other.left)
- return true;
- else if (*my.left == *other.left)
- {
- short int fRight = *my.right;
- short int sRight = *other.right;
- int power = int(pow(10, abs(getShortSize(*my.right) - getShortSize(*other.right))));
- if (getShortSize(fRight) <= getShortSize(sRight))
- {
- if (*my.right * power < *other.right)
- return false;
- else if (*my.right * power == *other.right)
- {
- if (my.nZeros < other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- else
- {
- if (*my.right < *other.right * power)
- return false;
- else if (*my.right == *other.right * power)
- {
- if (my.nZeros < other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- }
- else
- return false;
- }
- bool operator== (const Pair& my, const Pair& other)
- {
- if (*my.left != *other.left)
- return false;
- else
- if (*my.right != *other.right)
- return false;
- else
- if (my.nZeros != other.nZeros)
- return false;
- return true;
- }
- bool operator!= (const Pair& my, const Pair& other)
- {
- if (*my.left == *other.left)
- return false;
- else
- if (*my.right == *other.right)
- return false;
- else
- if (my.nZeros == other.nZeros)
- return false;
- return true;
- }
- bool operator> (const Pair& my, const Pair& other)
- {
- if (*my.left > * other.left)
- return true;
- else if (*my.left == *other.left)
- {
- short int fRight = *my.right;
- short int sRight = *other.right;
- int power = int(pow(10, abs(getShortSize(*my.right) - getShortSize(*other.right))));
- if (getShortSize(fRight) <= getShortSize(sRight))
- {
- if (*my.right * power < *other.right)
- return false;
- else if (*my.right * power == *other.right)
- {
- if (my.nZeros > other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- else
- {
- if (*my.right < *other.right * power)
- return false;
- else if (*my.right == *other.right * power)
- {
- if (my.nZeros > other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- }
- else
- return false;
- }
- bool operator< (const Pair& my, const Pair& other)
- {
- if (*my.left < *other.left)
- return true;
- else if (*my.left == *other.left)
- {
- short int fRight = *my.right;
- short int sRight = *other.right;
- int power = int(pow(10, abs(getShortSize(*my.right) - getShortSize(*other.right))));
- if (getShortSize(fRight) <= getShortSize(sRight))
- {
- if (*my.right * power > * other.right)
- return false;
- else if (*my.right * power == *other.right)
- {
- if (my.nZeros < other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- else
- {
- if (*my.right > * other.right * power)
- return false;
- else if (*my.right == *other.right * power)
- {
- if (my.nZeros < other.nZeros)
- return false;
- else
- return true;
- }
- else
- return true;
- }
- }
- else
- return false;
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- int k;
- Pair d(77, 11);
- Pair p(54, 9);
- Pair e, f;
- cout << p << endl;
- cout << d;
- cout << endl;
- cout << "Сложение" << endl;
- e = p + d;
- cout << e.toString();
- cout << endl;
- cout << "Вычитание =" << endl;
- e = p - d;
- cout << e.toString();
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement