/* Problem #1 -- Stanford Local Programming Contest - 2003 Solution by manku@stanford.edu */ #include #include double d[10] ; int up[10], down[10] ; int gcd (int a, int b) { int t ; if (a*b == 0) return 1 ; while (a) t=b%a, b=a, a=t ; return b; } int value (char *s, int len) { int i, x=0 ; for (i = 0; i < len; i++) x=(x*10)+(s[i]-'0') ; return x ; } int power (int x, int p) { int a = 1 ; while (p) a*=x, p-- ; return a ; } void get_frac(int A, int B, int a, int b, int index) { int X = (b==0) ? A : A * (power(10,b) - 1) + B ; int Y = (b==0) ? power(10,a) : power(10,a) * (power(10,b) - 1) ; int g = gcd(X, Y) ; if (X == 0) Y = 1 ; up[index] = X/g ; down[index] = Y/g ; d[index] = (up[index] * 1.0) / down[index] ; return ; } void handle (char *s) { int i, j, A, B, up_tmp, down_tmp ; double d_tmp ; int slen = strlen (s) ; for (i = 0; i <= slen; i++) { A = value (s, i) ; B = value (s + i, slen-i) ; get_frac (A,B,i, slen-i, i) ; } for (i = 0; i <= slen; i++) for (j = 0; j < i; j++) if (d[j] > d[i]) { d_tmp=d[j], d[j]=d[i], d[i]=d_tmp ; up_tmp=up[j], up[j]=up[i], up[i]=up_tmp; down_tmp=down[j], down[j]=down[i], down[i]=down_tmp ; } fprintf (stdout, "0.%s =", s) ; for (i = 0; i <= slen; i++) if ((i == 0) || (up[i] != up[i-1]) || (down[i] != down[i-1])) fprintf (stdout, " %d/%d", up[i], down[i]) ; fprintf (stdout, "\n") ; return ; } int main(int argc, char *argv[]) { char s[10] ; while (scanf ("%s", &s[0]) == 1) handle (&s[2]) ; return 0 ; }