题目简介
给定一个 n*n 的矩阵,输出它的行列式值和逆矩阵(保证存在)。
说明
期末复习线性代数时,发现自己求逆矩阵总是求错,于是干脆写了个程序来实现。。至于是列主元还是全主元还是约当什么的……以后来填这个坑。
高斯消元法求解线性方程组只要稍微修改下代码就可以,判断无解/无穷多解也不难,至于求自由未知量然后输出任意一解……还没有想好,也是以后再来填(逃
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const int N = 12;
void gauss(double a[][N], double b[], double x[], int n)
{
int i;
double s;
for (int k = 1; k <= n; ++k) {
for (i = k; i <= n && fabs(a[i][k]) < eps; ++i);
if (i != k) {
for (int j = k; j <= n; ++j)
swap(a[i][j], a[k][j]);
swap(b[i], b[k]);
}
for (i = k+1; i <= n; ++i) {
s = a[i][k] / a[k][k];
for (int j = k; j <= n; ++j)
a[i][j] -= a[k][j] * s;
b[i] -= b[k] * s;
}
}
for (i = n; i >= 1; --i) {
s = b[i];
for (int j = i+1; j <= n; ++j)
s -= x[j] *a[i][j];
x[i] = s / a[i][i];
if (fabs(x[i]) < eps) x[i] = 0;
}
}
int main()
{
double a[N][N], b[N], x[N], mt[N][N], mk[N][N];
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> mk[i][j];
a[i][j] = mk[i][j];
}
b[i] = 0;
}
gauss(a, b, x, n);
double det = 1;
for (int i = 1; i <= n; ++i)
det *= a[i][i];
if (fabs(det) < eps) det = 0;
printf("%0.2f\n", det);
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j)
a[i][j] = mk[i][j];
b[i] = 0;
}
b[k] = 1;
gauss(a, b, x, n);
for (int i = 1; i <= n; ++i)
mt[i][k] = x[i];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j < n; ++j)
printf("%0.2f ", mt[i][j]);
printf("%0.2f\n", mt[i][n]);
}
return 0;
}