#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,k,n, sign = 1;
double det = 1; double temp;
double a[10][10],b[10][10];
// Nhap cap cua ma tran:
printf("\nCap cua ma tran vuon, n = "); scanf("%d",&n);
// Nhap ma tran a:
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
printf("a[%d][%d] = ", i, j);
scanf("%lf",&a[i][j]);
}
// Tinh dinh thuc cua a
for (i = 0; i < n-1; i++)
{
if (a[i][i] == 0) // Nếu gặp phần tử trên đường chéo chính bằng 0 thì tìm hàng khác để đổi
{
k = i+1;
while (k < n && a[k][i] == 0) k++;
if (k==n) { printf("\ndet(a) = 0"); break;} // Không timg thấy, tức det(a) = 0
for (j = i; j < n; j++)// Đổi hàng i với hàng k
{
temp = a[i][j];
a[i][j] = a[k][j];
a[k][j] = temp;
}
sign = -sign; // Định thức đổi dấu đó
}
for (j = i+1; j < n; j++)// Biển đổi để các phần tử cùng cột ở hàng dưới bằng 0 đó
{
temp = -a[j][i]/a[i][i];
for (k = i+1; k < n; k++) a[j][k] += temp*a[i][k]; // Nhân hàng i với (-a[j][i]/a[i][i]) rồi cộng vào hàng j
}
det *= a[i][i]; // Tính dần det(a)
}
det *= a[n-1][n-1]; // Nhân với phần tử cuối chéo chính nữa là xong
printf("\ndet(a) = %lf\n",det);
//Tinh ma tran nguoc
if (det != 0)
{
for (i = 0; i < n; i++) // Tạo ra b là ma trận đơn vị đó
for (j = 0; j < n; j++)
if (i==j) b[i][j] = 1; else b[i][j] = 0;
for (i = 0; i < n; i++) // Xử lý từ hàng đầu đến hàng cuối
{
if (a[i][i] == 0) // Nếu gặp phần tử trên đường chéo chính bằng 0 thì đổi hàng
{
k = i+1;
while (k < n && a[k][i] == 0) k++;
for (j = 0; j < n; j++) // Đổi hàng đó của a đó, cả với ma trận b nữa
{
temp = a[i][j];
a[i][j] = a[k][j];
a[k][j] = temp;
temp = b[i][j];
b[i][j] = b[k][j];
b[k][j] = temp;
}
}
temp = a[i][i];
for (j = i; j < n; j++) a[i][j] /= temp;
for (j = 0; j < n; j++) b[i][j] /= temp;
for (j = i+1; j < n; j++)
{
temp = -a[j][i];
for (k = i; k < n; k++) a[j][k] += temp*a[i][k];
for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
}
}// Kết thúc quá trình Gauss
for (i = n-1; i > 0; i--) // Bắt đầu quá trình Jordan
for (j = i-1; j >=0; j--)
{
temp = -a[j][i];
for (k = n-1; k >= i; k--) a[j][k] += temp*a[i][k];
for (k = 0; k < n; k++) b[j][k] += temp*b[i][k];
}
for (i = 0; i < n; i++)// In ra ma trận b, bây giờ là ma trận nghich đảo của a
{
for (j = 0; j < n; j++) printf("%8.3lf\t", b[i][j]);
printf("\n");
}
}
else printf("\nKhong co ma tran nghich dao\n");
getch();
}