AOJ - Problem 0004 : Simultaneous Equation

連立方程式を解く問題です。

yについて変形し代入し、xを求めます。
とても無駄が多く参考にならないコードです(汗)
一応Acceptしていますが…
問題文の下の方のHintにも書いていますが、xが-0になることがありますが、-0.000と出力するとWAになるので気をつけましょう。

頭のいい人なら変数の数が2つでなくnの場合でも解けるコードを書くのだろう…。

#include <cstdio>

#define X 0
#define Y 1
#define C 2
#define SIKI1 0
#define SIKI2 1
#define LEFT  0
#define RIGHT 1

int main(){
	double A[3][3][3];
	double n[6];

	while ( scanf("%lf %lf %lf %lf %lf %lf",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5]) != EOF ){
		//変数の初期化
		for (int i=0 ; i<=RIGHT ; i++){
			for (int j=0 ; j<=SIKI2 ; j++){
				for (int k=0 ; k<=C ; k++){
					A[i][j][k] = 0;
				}
			}
		}

		//値の代入
		A[LEFT][SIKI1][X]  = n[0];
		A[LEFT][SIKI1][Y]  = n[1];
		A[RIGHT][SIKI1][C] = n[2];
		A[LEFT][SIKI2][X]  = n[3];
		A[LEFT][SIKI2][Y]  = n[4];
		A[RIGHT][SIKI2][C] = n[5];

		//式1のXを左辺から右辺へ移項する
		A[ RIGHT ][ SIKI1 ][ X ]  += (-1.0)*(A[ LEFT ][ SIKI1 ][ X ]);
		A[ LEFT  ][ SIKI1 ][ X ]  = 0;

		//式1の両辺をYの係数で割る		
		A[ RIGHT ][ SIKI1 ][ X ]  /= A[ LEFT ][ SIKI1 ][ Y ];
		A[ RIGHT ][ SIKI1 ][ C ]  /= A[ LEFT ][ SIKI1 ][ Y ];
		A[ LEFT  ][ SIKI1 ][ Y ]  = 1;

		//式2のYに代入して式2を(ax = b)の形にする
		int a = A[ LEFT ][ SIKI2 ][ Y ];
		A[ LEFT  ][ SIKI2 ][ X ]  += a * A[ RIGHT ][ SIKI1 ][ X ];
		A[ LEFT  ][ SIKI2 ][ Y ]   = 0;
		A[ RIGHT ][ SIKI2 ][ C ]  += a * A[ RIGHT ][ SIKI1 ][ C ] * (-1.0);
		//XYの解が求まる
		double answerX = A[ RIGHT ][ SIKI2 ][ C ] / A[ LEFT ][ SIKI2 ][ X ];
		double answerY = (n[2] + n[0]*answerX*(-1.0))/n[1];
		
		//小数第4位を四捨五入する
		if ( (((int)(answerX*10000))%10) >= 5){
			answerX += 0.001;
		}
		if ( (((int)(answerY*10000))%10) >= 5){
			answerY += 0.001;
		}
		if (answerX==-0.0){
			answerX = 0;
		}
		
		//解の出力
		printf("%.3f %.3f\n", answerX , answerY);
	}

	return 0;
}