/* ID: richard20 PROG: fracdec LANG: C++ */ using namespace std; #include #include #define MAXSIZE 1000000 typedef pair PINT; PINT store [MAXSIZE]; ostream& operator<< (ostream& out, PINT& p) { out << p.first << " r " << p.second; return out; } void print () { cout << "PRINT" << endl; for (int i = 0 ; i < MAXSIZE ; i ++) { if (store[i].first == 0 && store[i].second == 0) break; cout << store[i] << endl; } } PINT divide(int n, int d) { //cout << "DIV -> " << n << " / " << d << endl; return PINT(n/d,n%d); } int log(int i) { if (i < 10) return 1; if (i < 100) return 2; if (i < 1000) return 3; if (i < 10000) return 4; if (i < 100000) return 5; if (i < 1000000) return 6; if (i < 10000000) return 7; return 8; } int main () { ifstream in ("fracdec.in"); int n,d; in >> n >> d; //cout << n << " / " << d << endl; //cout << n/d << endl; //n -= (n/d)*d; //cout << n << " / " << d << endl; store[0] = divide(n,d); int startb = -1; int endb = -1; // the O(N^2 algo) int i; for (i = 1 ; i < MAXSIZE ; i ++) { store[i] = divide(store[i-1].second*10,d); //check if (store[i].second == 0) { i++; break; } for (int j = 1 ; j < i ; j ++) { if (store[i] == store[j]) { startb = j; goto end; } } //cout << div << endl; } end: //cout << startb << endl; //print(); int decplace = log(n/d); int caret = 0; char str [MAXSIZE]; for (int j = 1 ; j < i ; j++) { if (j == startb) { str[caret++] = '('; startb = -2; j--; continue; } str[caret++] = '0'+(store[j].first); //cout << store[j].first; } if (startb != -1) str[caret++] = ')'; ofstream out("fracdec.out"); int pushover = 76; cout << (n/d) << '.'; int count = log(n/d); for (int i = 0 ; i < caret ; i++) { count++; if (count == pushover) { count = 0; cout << '\n'; } cout << str[i]; } cout << endl; out.close(); return 0; }