解答例 - j1.lesson10.PowerOpt

package j1.lesson10;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 課題1001 - 解答例.
 @author s.arakawa
 @version $Id: PowerOpt_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class PowerOpt {
    
    /**
     * プログラムエントリ。
     * 次のような擬似コードで表される。
     <pre>
     * プログラム全体
     *     print &quot;mの値を入力:&quot;
     *     m = コンソール入力 (実数)
     *     print &quot;nの値を入力:&quot;
     *     n = コンソール入力 (整数)
     *     print &quot;mのn乗はpower(m,n)&quot;
     </pre>
     @param args 無視される
     @throws IOException 入力時に例外が発生した場合
     */
    public static void main(String[] argsthrows IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        // print "nの値を入力:"
        System.out.print("mの値を入力:");
        // m = コンソール入力 (実数)
        double m = Double.parseDouble(reader.readLine());
        // print "nの値を入力:"
        System.out.print("nの値を入力:");
        // n = コンソール入力 (整数)
        int n = Integer.parseInt(reader.readLine());
        // print "mのn乗はpower(m,n)"
        System.out.println(m + "の" + n + "乗は" + power(m,n));
    }
    
    /**
     * m の n 乗を計算する。
     * 下記の擬似コードで表される。
     <pre>
     * power(m,n)
     *     if n が 0
     *         結果は 1
     *     if n が負の値
     *         結果は power(1/m, -n)
     *     sub = power(m, floor(n/2))
     *     if n が偶数
     *         結果は sub * sub
     *     else
     *         結果は m * sub * sub
     </pre>
     @param m べき乗される値
     @param n 指数
     @return m の n 乗
     */
    public static double power(double m, int n) {
        // if n が 0
        if (n == 0) {
            // 結果は 1
            return 1.0;
        }
        // if n が負の値
        if (n < 0) {
            // 結果は power(1 / m, -n)
            return power(/ m, -n);
        }

        // sub = power(m, n / 2)
        double sub = power(m, n / 2);
        
        // if n が偶数
        if (n % == 0) {
            // 結果は sub^2
            return sub * sub;
        }
        // if n が奇数
        else {
            // 結果は m * sub^2
            return m * sub * sub;
        }
    }
}