#include <stdio.h>
int transposed_matrix(int a[2][2]); /* 行列を転置してdet(a)返す関数 */
int gcd(int a, int b); /* 最大公約数@gcd */
void print_matrix(int a[2][2]); /* 2行2列行列の表示 */
void print_frac_matrix(int numerator[2][2], int denominator[2][2]); /* 2行2列行列の分数表示 */
void scan_matrix(int a[2][2]); /* 2行2列行列の取得 */
int main(void)
{
int a[2][2];
int div_a[2][2]; /* diviser of a */
int det; /* det(a) */
int i, j;
scan_matrix(a);
print_matrix(a);
det = transposed_matrix(a);
printf("の逆行列は\n");
if(det == 0)
{
printf("存在しない\n");
return 0;
}
/* 転置行列をdet(a)で割り算した際の(つまり逆行列の)分子分母を計算 */
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
div_a[i][j] = gcd(a[i][j], det);
a[i][j] /= div_a[i][j];
div_a[i][j] = det / div_a[i][j];
}
}
print_frac_matrix(a, div_a);
return 0;
}
/* 相異なる整数値の交換 */
void int_swap(int *a,int *b)
{
if(*a==*b) return;
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
/* 行列を転置してdet(a)返す関数 */
int transposed_matrix(int a[2][2]){
int_swap(&a[0][0],&a[1][1]);
int_swap(&a[0][1],&a[1][0]);
a[0][1] *= -1;
a[1][0] *= -1;
return a[0][0] * a[1][1] - a[0][1] * a[1][0];
}
/* 最大公約数@gcd */
int gcd(int a, int b)
{
if(b == 0)
{
return a;
}
else
{
return gcd(b, a%b);
}
}
/* 2行2列行列の表示 */
void print_matrix(int a[2][2]){
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%7d ",a[i][j]);
}
printf("\n");
}
}
/* 2行2列行列の分数表示 */
void print_frac_matrix(int numerator[2][2], int denominator[2][2]){
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(denominator[i][j] == 1)
{
printf("%7d ", numerator[i][j]);
}
else
{
printf("%3d/%3d ", numerator[i][j], denominator[i][j]);
}
}
printf("\n");
}
}
/* 2行2列行列の取得 */
void scan_matrix(int a[2][2]){
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("要素(%d,%d)の入力\n",i,j);
scanf("%d",&a[i][j]);
}
}
}