#include #include using namespace std; const int MAXN = 10; class frac { public: long long num, den; frac() : num(0), den(1) {}; frac(long long a[], int n) { num = a[n-1]; den = 1; for(int i=n-2; i>=0; i--) { long long tmp = num; num = a[i]*num + den; den = tmp; } } long long gcd(long long a, long long b) { if (b == 0) return a; else return gcd(b, a%b); } void reduce() { if (den < 0) { num *= -1; den *= -1; } long long factor; if (num < 0) factor = gcd(-num, den); else factor = gcd(num, den); //cout << "num, den, facrot = " << num << ',' << den << ',' << factor << endl; num /= factor; den /= factor; } frac operator+(frac rhs) { frac ans; ans.num = num*rhs.den + den*rhs.num; ans.den = den*rhs.den; if (ans.den < rhs.den || ans.den < den) cout << "ERROR: overflow: " << den << "*" << rhs.den <<"=" << ans.den<< endl; ans.reduce(); return ans; } frac operator-(frac rhs) { frac ans; ans.num = num*rhs.den - den*rhs.num; ans.den = den*rhs.den; if (ans.den < rhs.den || ans.den < den) cout << "ERROR: overflow" << endl; ans.reduce(); return ans; } frac operator*(frac rhs) { frac ans; ans.num = num*rhs.num; ans.den = den*rhs.den; if (ans.den < rhs.den || ans.den < den) cout << "ERROR: overflow" << endl; ans.reduce(); return ans; } frac operator/(frac rhs) { frac ans; ans.num = num*rhs.den; ans.den = den*rhs.num; ans.reduce(); return ans; } void convert(long long n, long long d, vector &a) { //cout << "n,d = " << n << d << endl; while (n != 0) { a.push_back(d/n); //cout << " a[" << len << "] = " << a[len] << endl; long long tmp = n; n = d%n; d = tmp; //cout << "n,d = " << n << d << endl; } } void convert(vector &a) { a.push_back(num/den); if (num < 0) { if ((-num)%den == 0) return; a[0]--; convert(den - (-num)%den, den, a); } else convert(num%den, den, a); } }; void output(frac r) { vector a; //cout << r.num << '/' << r.den << endl; r.convert(a); bool ok = true; for(int i=0; i 0 && a[i] <= 0) ok = false; if (i == a.size()-1) cout << endl; else cout << ' '; } if (!ok) cout << "ERROR: invalid partial quotient" <> n1 >> n2; while (n1 != 0) { icase++; long long a1[MAXN], a2[MAXN]; for(int i=0; i> a1[i]; for(int i=0; i> a2[i]; frac r1(a1, n1), r2(a2, n2); cout << "Case " << icase <<":" << endl; frac r; // output(r1); // output(r2); r = r1+r2; output(r); r = r1-r2; output(r); r = r1*r2; output(r); r = r1/r2; output(r); cin >> n1 >> n2; } }