Problem:
循環小数

2 つの正の整数 p, q を入力し、 p / q を小数として正確に表現することを考えます。(ただし、0 < p < q < 106とします。)

このとき、結果は

有限の桁で正確に表現できる。

ある桁の範囲を繰り返す循環小数となる。

のいずれかとなります。筆算と同じ手順で1桁ずつ小数部を求めていくと、

割り切れた(余りが 0 になった)なら、そこまでの桁で正確に表現できた。

1度出てきた余りが、再び現れたなら、循環した。

と区別できます。

2 つの整数 p, q を入力すると、 p / q を小数で表した時の、小数部を出力するプログラムを作成してください。 ただし、

結果が有限の桁で正確に表現できる時は、数値だけを 1 行に出力してください。

結果が循環小数になる時は次のように 2 行に出力してください。

最初の行に、循環する部分までの数字を出力してください。

次の行には、循環しない部分の下には空白を出力し、循環する部分の下には「^」を出力してください。

いずれの場合も数字列は 80 文字を超えることはないものとします。

Input

入力は複数のデータセットからなります。各データセットとして、p, q が空白区切りで１行に与えられます。データセットの数は 250 を超えません。

Output

データセットごとに、循環しない小数の場合は数値の小数部分を(この場合 1 行)、循環小数の場合は循環するまでの数字と循環する部分を示す記号「^」(この場合 2 行) を出力してください。

Sample Input

1 12
10000 32768
1 11100
1 459550

Output for the Sample Input

083
^
30517578125
00009
^^^
00000217604178
^^^^^^^^^^^^

Solution in JAVA (judge verdict: Accepted)

// 過去イチで酷い実装、いつかリファクタリングしたい
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;

        while ((line = br.readLine()) != null) {
            String[] input = line.split(" ");
            int p = Integer.parseInt(input[0]);
            int q = Integer.parseInt(input[1]);
            String qs = ""; // 商の羅列
            int[] rs = new int[81]; // 余りの羅列
            int pos = 0;
            StringBuilder second = new StringBuilder(); // 循環部を表示するため
            boolean isLoop = false;

            p -= (p / q) * q; // p < qにする
            rs[pos] = p;

            wh: while (true) {
                int sho = (10 * p) / q;
                p = (10 * p) % q;

                if (p == 0) {
                    qs = qs + sho;
                    break;
                }

                int i;
                for (i = pos; i >= 0; i--) {
                    if (rs[i] == p) {
                        qs = qs + sho;

                        int marklength = qs.length() - i;
                        for (int j = 0; j < i; j++) {
                            second.append(" ");
                        }
                        for (int j = 0; j < marklength; j++) {
                            second.append("^");
                        }
                        isLoop = true;
                        break wh;
                    }
                }

                qs = qs + sho;
                rs[++pos] = p;
            }

            if (isLoop) {
                System.out.println(qs);
                System.out.println(second.toString());
            } else {
                System.out.println(qs);
            }

        }
    }
}