package j1.lesson05;
import java.io.*;
/**
* 課題0504 - 解答例.
* @author s.arakawa
* @version $Id: Dichotomy_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
*/
public class Dichotomy {
/**
* コンソールに実数を一つ入力させ、その値の平方根の近似値を二分法を用いて計算するプログラム。
* @param args 無視される
* @throws IOException 入力中に例外が発生した場合
*/
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// n: 入力された値を保存する
System.out.print("正の値を入力:");
double n = Double.parseDouble(reader.readLine());
if (n < 0) {
System.out.println("正の値を入力してください");
}
else {
// 方針
// 課題に書いてある手続をその形のままプログラムへ
// 1. a = 0, b = n とおく
double a = 0.0;
double b = n;
// (n < 1 のときは b = 1 とおく)
if (n < 1) {
b = 1.0;
}
// c: 中間値を保存する
double c;
// do-while を使っているならば変数 c を初期化しないでよいが、
// while などで実装した場合はこの時点で初期化しておくこと。
// そうしないと、c に一度も値を代入しないまま使用される可能性があるため、
// コンパイルエラーとなってしまう。
// (do-while は必ず1度は実行される(=代入される)ので問題ない)
// 入り口に判定がなく、出口に判定があるタイプなので
// この問題では do-while を使用できる
do {
// 2. c = (a + b) / 2 とおく
c = (a + b) / 2;
// fc: f(c)
double fc = c * c - n;
// 3. 次の条件を判定
// f(c) < 0 であれば a = c とする
if (fc < 0) {
a = c;
}
// f(c) == 0 であれば 解は c
else if (fc == 0) {
// これ以上探す必要もないので、a = b = c とする
a = c;
b = c;
}
// f(c) > 0 であれば b = c とする
else {
b = c;
}
// 4. 十分に小さくなるまで、現在のa,bを用いて 2 へ戻る
// 5. b - a が十分に小さくなったら終了、そのとき 解の近似値は c
} while (b - a >= 0.0001);
// 5. そのとき 解の近似値は c
System.out.println("結果は" + c);
}
}
}
|