#include #include #include using namespace std; struct fract { uint64_t n,d; void fix() { // euclid's alg uint64_t a=n,b=d,c=20; if(n==0) {d=1; return;} while(c>0) { c=a%b; a=b; b=c; } n/=a; d/=a; } fract(uint64_t n, uint64_t d) { this->n = n; this->d=d; fix(); } bool operator == (const fract &x) const { return n==x.n && d==x.d; } bool operator < (const fract &x) const { return n*x.d < x.n*d; } }; int ten2(int n) { int x=1; for(int i=0; i fl; string digs = s.substr(2); for(unsigned i=0; i<=digs.length(); i++) { string t=digs.substr(0,i); string r=digs.substr(i); fract term(atoi(t.c_str()), ten2(i)); fract rep(atoi(r.c_str()), ten2(i)*(ten2(digs.length()-i)-1)); fract res = fract(rep.n*term.d + term.n*rep.d, rep.d*term.d); /* if(res.d<1) { printf("0.%s(%s) --> %d/%d\n", t.c_str(),r.c_str(),res.n,res.d); printf("0.%s = %d/%d 0.[...]%s = %d/%d\n", t.c_str(), term.n,term.d, r.c_str(), rep.n,rep.d); }*/ fl.insert(fract(rep.n*term.d + term.n*rep.d, rep.d*term.d)); } cout << s << " ="; for(set::iterator it = fl.begin(); it != fl.end(); it++) cout << " " << it->n << "/" << it->d; cout << endl; } int main() { while(cin) { string s; cin >> s; if(s.empty()) continue; process(s); } return 0; }