Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

実数既約分数化

実数のうち、小数部が循環するものと有限桁のものは分数として表すことができます。

分数で表すことができる実数が与えられたとき、その実数と等しい既約分数（それ以上約分できない分数）を出力するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

str

１行に、変換したい実数を表す文字列 str が与えられる。実数の値は 0 より大きい。文字列は数字か「.」、「(」、「)」を含む、長さが 3 以上 8 以下の文字列である。「.」は小数点、「(」は数字の循環の始まり、「)」は数字の循環の終わりを示す。整数部にも小数部にも、必ず１桁以上の数字が与えられるとする。ただし、循環小数が与えられた場合、文字列は以下の条件を満たす。

循環の始まりと終わりのペアは、小数点の右側に一度だけ現れる。

循環の終わりを示す「)」は、文字列の末尾に現れる。

循環の始まりと終わりの間には、必ず１桁以上の数字が与えられる。

Output

実数を既約分数で表した形式（分子の整数に続けて「/」区切りで分母の整数を並べたもの）で出力する。

Sample Input 1

0.(3)

Sample Output 1

1/3

Sample Input 2

1.0

Sample Output 2

1/1

Sample Input 3

5.2(143)

Sample Output 3

52091/9990

Sample Input 4

0.0739

Sample Output 4

739/10000

Solution in JAVA (judge verdict: Accepted)

import java.util.*;

class Main{

    int gcd(int x, int y){
        return y > 0 ? gcd(y, x%y) : x;
    }

    void print(int x, int y){
        int g = gcd(x, y);
        System.out.println(x/g + "/" + y/g);
    }

    void solve(){
        Scanner sc = new Scanner(System.in);
        String in = sc.next();
        int o, p, l, d;
        o = p = -1;
        String all = "", sub = "";
        for ( int i = 0; i < in.length(); i++ ){
            if ( in.charAt(i) == '.' ){
                o = i;
            } else if ( in.charAt(i) == '(' ) {
                p = i;
                sub = all;
            } else if ( in.charAt(i) == ')' ) {
            } else {
                all += in.charAt(i);
            }
        }
        d = in.length() - o - 1;
        l = p - o - 1;
        if ( p == -1 ){
            print(Integer.parseInt(all), (int)Math.pow(10, d));
        }else {
            d -= 2; // for ()
            print(Integer.parseInt(all)- Integer.parseInt(sub), (int)Math.pow(10, d) - (int)Math.pow(10, l) );
        }
    }

    public static void main(String[] args){
        new Main().solve();
    }
}