// // Created by rafalbyczek on 28.05.16. // #ifndef ZADANIE_J_DZIWNE_LICZBY_WEIRDNUMBER_H #define ZADANIE_J_DZIWNE_LICZBY_WEIRDNUMBER_H #include using namespace std; class WeirdNumber { private: int a, b, d; WeirdNumber *c; public: WeirdNumber(const int a = 0, const int b = 0) : a(a), b(b), c(NULL), d(1) { } ~WeirdNumber() { if (c != NULL) { (*c).a += d; } } WeirdNumber &operator=(const WeirdNumber &k) { if (this != &k) { a = k.a; b = k.b; } return *this; } WeirdNumber &operator+(const WeirdNumber &k) { return *(new WeirdNumber(a + k.a, b + k.b)); } WeirdNumber &operator-(const WeirdNumber &k) { return *(new WeirdNumber(a - k.a, b - k.b)); } WeirdNumber &operator*(const WeirdNumber &k) { return *(new WeirdNumber(a * k.a + 2 * b * k.b, a * k.b + b * k.a)); } WeirdNumber &operator+=(const WeirdNumber &k) { a += k.a; b += k.b; return *this; } WeirdNumber &operator-=(const WeirdNumber &k) { a -= k.a; b -= k.b; return *this; } WeirdNumber &operator*=(const WeirdNumber &k) { int A = a * k.a + 2 * b * k.b; int B = a * k.b + b * k.a; a = A; b = B; return *this; } bool operator==(const WeirdNumber &k) { return (a == k.a && b == k.b); } bool operator!=(const WeirdNumber &k) { return (a != k.a || b != k.b); } WeirdNumber operator++(int) { WeirdNumber C(a, b); C.c = this; C.d = 1; return C; } WeirdNumber &operator++() { a++; return *this; } WeirdNumber operator--(int) { WeirdNumber C(a, b); C.c = this; C.d = -1; return C; } WeirdNumber &operator--() { a--; return *this; } friend ostream &operator<<(ostream &stream, WeirdNumber const &w) { if (w.a != 0) stream << w.a; if (w.b > 0 && w.b != 1 && w.b != -1) { if(w.a != 0) stream << "+"; stream << w.b << "s"; } if (w.b < 0 && w.b != 1 && w.b != -1) stream << w.b << "s"; if (w.b == 1) { if(w.a != 0) { stream << "+s"; } else { stream << "s"; } } if (w.b == -1) { stream << "-s"; } if (w.a == 0 && w.b == 0) { stream << "0"; } return stream; } }; #endif //ZADANIE_J_DZIWNE_LICZBY_WEIRDNUMBER_H