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 "mの値を入力:"
* m = コンソール入力 (実数)
* print "nの値を入力:"
* n = コンソール入力 (整数)
* print "mのn乗はpower(m,n)"
* </pre>
* @param args 無視される
* @throws IOException 入力時に例外が発生した場合
*/
public static void main(String[] args) throws 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(1 / m, -n);
}
// sub = power(m, n / 2)
double sub = power(m, n / 2);
// if n が偶数
if (n % 2 == 0) {
// 結果は sub^2
return sub * sub;
}
// if n が奇数
else {
// 結果は m * sub^2
return m * sub * sub;
}
}
}
|