1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <iostream> using namespace std; typedef long long ll; class Main { private: ll ans1, ans2, pos; public: Main(ll a, ll b) { set(a, b); } void set(ll a, ll b) { pos = 1; ans1 = a; ans2 = b; if (a < 0) { ans1 *= -1; pos *= -1; } if (b < 0) { ans2 *= -1; pos *= -1; } } void getSmall() { ll ta = ans1, tb = ans2; while (tb != 0) { ll temp = ta % tb; ta = tb; tb = temp; } ans1 /= ta; ans2 /= ta; } static void swap(Main& a, Main& b) {Main temp = a; a = b; b = temp; } static void add(Main* a, Main* b, Main* ans) { ll ans1 = a->ans1 * b->ans2 * a->pos + a->ans2 * b->ans1 * b->pos; ll ans2 = a->ans2 * b->ans2; ans->set(ans1, ans2); ans->getSmall(); } double toDouble() { return 1.0 * pos * ans1 / ans2; } ll getSon() { return ans1; } ll getMother() { return ans2; } }; int main() { ll a1, a2, b1, b2, n; scanf("%lld/%lld %lld/%lld %lld", &a1, &a2, &b1, &b2, &n); Main x(a1, a2), y(b1, b2), ans(1, n), one(1, n); if (x.toDouble() > y.toDouble()) Main::swap(x, y); int count = 0; while (1) { if (ans.toDouble() > x.toDouble() && ans.toDouble() < y.toDouble()) { if (ans.getMother() == n) { if (count++ == 0) cout << ans.getSon() << "/" << n; else cout << " " << ans.getSon() << "/" << n; } } else if (ans.toDouble() > y.toDouble()) { break; } Main::add(&ans, &one, &ans); } return 0; }
|