#include #include using namespace std; class enumN { protected: string curr; bool runout; public: enumN() { curr = "0"; runout = false; } string get() { return curr; } bool finished() { return runout; } void move_on() { int pos = curr.length() - 1; while (curr[pos] == '9') { curr[pos] = '0'; pos -= 1; } if (pos > -1) curr[pos] += 1; else { string one = "1"; curr = one + curr; } } }; class enumE { protected: enumN F; public: enumE() { } string get() { return F.get(); } bool finished() { return F.finished(); } void move_on() { F.move_on(); F.move_on(); } }; class enumO { protected: enumN F; public: enumO() { F.move_on(); } string get() { return F.get(); } bool finished() { return F.finished(); } void move_on() { F.move_on(); F.move_on(); } }; class enumZ { protected: enumN F; bool neg; public: enumZ() { neg = false; } string get() { string g = F.get(); if (neg) { string m = "-"; g = m + g; } return g; } bool finished() { return F.finished(); } void move_on() { if (neg) neg = false; else { F.move_on(); neg = true; } } }; int main() { enumN En; enumZ Ez; while (! En.finished() && ! Ez.finished()) { cout << En.get() << " " << Ez.get() << "\n"; En.move_on(); Ez.move_on(); } if (En.finished() && ! Ez.finished()) cout << "Z was bigger\n"; if (Ez.finished() && ! En.finished()) cout << "N was bigger\n"; }