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; }