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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include <iostream> #include <string> #include <algorithm> using namespace std; typedef long long ll; string toString (ll a) { string ans; while (a) { ans.append(1,(char)(a%10 + '0')); a/=10; } reverse(ans.begin(), ans.end()); return ans; } class Main { private: ll ans1,ans2, pos; public: Main(ll a, ll b) { pos = 1; ans1 = a; ans2 = b; if (a < 0) { ans1 *= -1; pos*=-1; } if (b < 0) { ans2 *= -1; pos*=-1; } } Main(Main& ob) { ans1 = ob.ans1; ans2 = ob.ans2; pos = ob.pos; } 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; } } string toString() { string ans; if (ans1 == 0 && ans2 != 0) { ans.append("0"); return ans; } if (ans2 == 0) { ans.append("Inf"); return ans; } getSmall(); if (pos == -1) { ans.append("(-"); } if (ans2 != 1) { if (ans1 < ans2) { ans.append(::toString(ans1)); ans.append("/"); ans.append(::toString(ans2)); } else if (ans1 == ans2) { ans.append("1"); } else { ll y = ans1 / ans2; ll ta1 = ans1; ta1 -= y * ans2; ans.append(::toString(y)); ans.append(" "); ans.append(::toString(ta1)); ans.append("/"); ans.append(::toString(ans2)); } } else { ans.append(::toString(ans1)); } if (pos == -1) { ans.append(")"); } return ans; } void getSmall() { ll ta = ans1, tb = ans2; while (tb != 0) { ll temp = ta % tb; ta = tb; tb = temp; } ans1 /= ta; ans2 /= ta; } 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); } static void sub(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); } static void mul(Main* a, Main* b, Main* ans) { ll ans1 = a->pos * b->pos * a->ans1 * b->ans1; ll ans2 = a->ans2 * b->ans2; ans->set(ans1, ans2); } static void dev(Main* a, Main* b, Main* ans) { ll ans1 = a->pos * b->pos * a->ans1 * b->ans2; ll ans2 = a->ans2 * b->ans1; ans->set(ans1, ans2); } }; int main() { ll a1,a2,b1,b2; scanf("%lld/%lld %lld/%lld", &a1, &a2, &b1, &b2); Main x(a1, a2); Main y(b1, b2); Main ans(0,0); Main::add(&x, &y, &ans); cout << x.toString() << " + " << y.toString() << " = " << ans.toString() << endl; Main::sub(&x, &y, &ans); cout << x.toString() << " - " << y.toString() << " = " << ans.toString() << endl; Main::mul(&x, &y, &ans); cout << x.toString() << " * " << y.toString() << " = " << ans.toString() << endl; Main::dev(&x, &y, &ans); cout << x.toString() << " / " << y.toString() << " = " << ans.toString() << endl; return 0; }
|