解答例 - j1.lesson09.LowestTerm

package j1.lesson09;

import java.io.*;

/**
 * 課題0902 - 解答例.
 @author s.arakawa
 @version $Id: LowestTerm_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class LowestTerm {

    /**
     * コンソールから整数で分子と分母を入力させ、その既約分数を表示するプログラム。
     @param args 無視される
     @throws IOException 入力時に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("分子を入力:");
        int n = Integer.parseInt(reader.readLine());
        
        if (n < 1) {
            System.out.println("1以上の整数を入力してください");
            return;
        }
        
        System.out.print("分母を入力:");
        int d = Integer.parseInt(reader.readLine());
        
        if (d < 1) {
            System.out.println("1以上の整数を入力してください");
            return;
        }

        printWithReduce(n, d);
    }
    
    /**
     * 引数で与えられた分子、分母を既約分数として表示する。
     * 分子、分母共に1以上の整数が与えられるものとして、それ以外の場合は考慮しない。
     * 既約分数へ変換するには、分子分母をそれらの最大公約数でそれぞれ割ってやればよい。
     @param numerator 分子
     @param denominator 分母
     */
    public static void printWithReduce(int numerator, int denominator) {
        int gcd = gcd(numerator, denominator);
        numerator /= gcd;
        denominator /= gcd;
        
        System.out.println(numerator + " / " + denominator);
    }

    /**
     * 引数で与えられた2つの整数の最大公約数を返す。
     <code>m, n</code> が負の値であった場合は考慮しなくて良い。
     <code>m, n</code> の最大公約数を求めるアルゴリズム gcd(m,n) は次のように表せる。
     <pre>
     * gcd(m,0) = m
     * gcd(m,n) = gcd(n, (mをnで割った余り)) (n != 0)
     </pre>
     @param m 整数1
     @param n 整数2
     @return 引数で与えられた2つの整数の最大公約数
     */
    public static int gcd(int m, int n) {
        if (n == 0) {
            return m;
        }
        else {
            return gcd(n, m % n);
        }
    }
}