#include <stdio.h>
#include <stdlib.h>
#define N 2
#define COL 128
int main(void)
{
int i, j, k;
double x[N][N], inv[N][N], res[N][N], s, d; // Cはfortranとは行と列が逆になる
char buf[COL];
/* x[][]の入力 */
printf("X = \n");
for (i = 0; i < N; i++) {
fgets(buf, COL, stdin);
sscanf(buf, "%lf %lf", &x[i][0], &x[i][1]);
}
/* 行列式の計算 */
d = x[0][0] * x[1][1] - x[0][1] * x[1][0];
/* 逆行列が定義出来るかどうか判定 */
if (d == 0.0) {
fprintf(stderr, "逆行列が定義出来ません(Xが正則行列ではありません)。\n");
exit(1);
}
printf("%f\n", d);
/* 逆行列の計算 */
inv[0][0] = x[1][1] / d;
inv[0][1] = -x[0][1] / d;
inv[1][0] = -x[1][0] / d;
inv[1][1] = x[0][0] / d;
/* inv[][]の出力 */
printf("X^(-1) = \n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%f ", inv[i][j]);
printf("\n");
}
/* x×invが単位行列になる事を確かめる */
for (i = 0; i < N; i++)
for (j = 0; j < N; j++) {
s = 0;
for (k = 0; k < N; k++)
s += x[i][k] * inv[k][j];
res[i][j] = s;
}
/* res[][]の出力 */
printf("X・X^(-1) = \n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%f ", res[i][j]);
printf("\n");
}
return 0;
}