模拟求逆过程写就可以了
e是单位矩阵,只通过行变换,把原矩阵变成单位矩阵。
消元的时候不能选主元。
#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
const int MAXN = 1000;
int n;
double a[MAXN][MAXN];
double e[MAXN][MAXN];
void init()
{
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
e[i][j] = i == j?1:0;
}
}
}
void low_mat()
{
for(int k = 0;k<n;k++){///往下扫
for(int i = k+1;i<n;i++){
double l = -a[i][k]/a[k][k];
for(int j = k;j<n;j++){
a[i][j] += l*a[k][j];
e[i][j] += l*e[k][j];
}
}
}
}
void up_mat()
{
for(int k = n-1;k>=0;k--){///再往上扫
for(int i = k-1;i>=0;i--){///千万别选主元,会跪
double l = -a[i][k]/a[k][k];
for(int j = k;j>=0;j--){
a[i][j] += l*a[k][j];
e[i][j] += l*e[k][j];
}
}
}
}
void I()
{
for(int i =0;i<n;i++){
for(int j =0;j<n;j++){
e[i][j] /= a[i][i];
}
}
}
int main()
{
freopen("in.txt","r",stdin);
while(cin >> n){
init();
for(int i =0;i<n;i++){
for(int j = 0;j<n;j++){
scanf("%lf",&a[i][j]);
}
}
low_mat();
up_mat();
I();
for(int i =0;i<n;i++){
for(int j =0;j<n;j++){
printf("%10.5lf",e[i][j]);
}
cout <<endl;
}
}
return 0;
}