#include <stdio.h>
#include <process.h>
#pragma warning (disable : 4996)

#define MAX 3
typedef float mxtype[MAX][MAX];
void matrixout(mxtype);
void main() {
	mxtype mxa, inversemx;
	int i, j, l, n;
	float sumx, sumy;
	float determins;
	printf("3x3인 정방행렬 A를 입력\n");
	printf("ex) 1 2 3\n    4 5 6\n    7 8 9\n\n");

	// 사용자가 입력할 정방행렬을 읽음
	for (i = 0; i < MAX; i++)
		for (j = 0; j < MAX; j++) {
			scanf("%f", &mxa[i][j]);
		}

	// 행렬 Ａ를 출력
	printf("%5cmatrix A\n", ' ');
	matrixout(mxa);


	sumx = 0;
	sumy = 0;
	determins = 0;
	// 행렬 Ａ의 행렬식 계산
	for (j = 0; j < MAX; j++) {
		l = (j + 1) % MAX;
		n = (j + 2) % MAX;
		sumx += mxa[0][j] * mxa[1][l] * mxa[2][n];
		sumy += mxa[0][j] * mxa[1][n] * mxa[2][l];
	}
	determins = sumx - sumy;
	putchar('\n');
	printf("%5cdeterminant%7c:%15E\n", ' ', ' ', determins);

	// 행렬식이 ０이면 역행렬을 계산하지 못함
	if (determins == 0) {
		printf("%5cinverse matrix does not exist\n", ' ');
		exit(1);
	}

	// 정방행렬 Ａ의 역행렬 계산
	for (i = 0; i < MAX; i++)
		for (j = 0; j < MAX; j++) {
			if (i == j) {
				switch (i) {
				case 0:
					inversemx[0][0] = mxa[1][1] * mxa[2][2] - mxa[1][2] * mxa[2][1];
					break;
				case 1:
					inversemx[1][1] = mxa[0][0] * mxa[2][2] - mxa[0][2] * mxa[2][0];
					break;
				case 2:
					inversemx[2][2] = mxa[0][0] * mxa[1][1] - mxa[0][1] * mxa[1][0];
					break;
				}
			}
			else {
				l = i + j;
				switch (l) {
				case 1: l = 2; break;
				case 2: l = 1; break;
				case 3: l = 0; break;
				}
				inversemx[i][j] = (mxa[i][l] * mxa[l][j] - mxa[i][j] * mxa[l][l]) * 1.0;
			}
		}
	// 계산된 역행렬을 출력
	for (i = 0; i < MAX; i++)
		for (j = 0; j < MAX; j++)
			inversemx[i][j] /= determins;
	printf("\n%5cinverse matrix\n", ' ');
	matrixout(inversemx);
}

// matrixout 함수가 정방행렬 mx를 출력
void matrixout(mxtype mx) {
	int i, j;
	putchar('\n');
	for (i = 0; i < MAX; i++) {
		for (j = 0; j < MAX; j++)
			printf("%15E ", mx[i][j]);
		printf("\n");
	}
}