AOJ 0004 Simultaneous Equation

リンク AOJ 0004 Simultaneous Equation

方針

連立方程式ということで、逆行列を作って両辺の左からかけました。
2次の行列式の定義はこちらが一番わかりやすいかも。
あとは愚直に式変形です。

  • \begin{bmatrix}a &b \\ d &e\end{bmatrix}\begin{bmatrix}x \\ y\end{bmatrix} = \begin{bmatrix}c \\ f\end{bmatrix}
    • \begin{bmatrix}x \\ y\end{bmatrix} = \begin{bmatrix}a&b\\d&e\end{bmatrix}^{-1}\begin{bmatrix}c \\ f\end{bmatrix}
    • \begin{bmatrix}x \\ y\end{bmatrix} = \frac{1}{ae - bd}\begin{bmatrix}e&-b\\-d&a\end{bmatrix}\begin{bmatrix}c \\ f\end{bmatrix}
    • \begin{bmatrix}x \\ y\end{bmatrix} = \frac{1}{ae - bd}\begin{bmatrix}ce-bf\\-cd+af\end{bmatrix}

ポイント

小数点以下第〜位まで出力してください。のような処理はprintf関数が便利です。

System.out.printf("%.4f", 0.12349);

このように書くと、小数第5位が四捨五入されて、小数第4位までが表示されます(0.1235が表示されます)。

ソース

import java.util.*;
public class Main {
    static Scanner sc = new Scanner(System.in);
    static double a, b, c, d, e, f;
    public static void main(String[] args) {
        while(read()){
            solve();
        }
    }
    static boolean read(){
        if(!sc.hasNext())return false;
        a = sc.nextDouble();
        b = sc.nextDouble();
        c = sc.nextDouble();
        d = sc.nextDouble();
        e = sc.nextDouble();
        f = sc.nextDouble();
        return true;
    }
    static void solve(){
        double det = a*e - b*d;
        double x = (c*e - b*f)/det, y = (-c*d + a*f)/det;
        if(x==0)x=0;
        if(y==0)y=0;
        System.out.printf("%.3f %.3f\n", x, y);
    }
        if(x==0)x=0;
        if(y==0)y=0;

この不思議な処理は x = -0.000という出力を防ぐためです。