【数论】——高斯列主元消元法
初等行变换
- 将某一行乘以一个非零数
- 交换某两行
- 将某一行的k倍加到另一行
消元思路
- 从左往右,找到第一列系数中,绝对值最大系数所在行
- 将该行每一个系数除以该行第一个非零系数
- 将该行后的所有行的该元素消去
- 重复1-3操作直到最后一行
- 从最后一行向上一次求出对应
x
i
x_i
xi的值
代码
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 110;
const double eps = 1e-6;
int n;
double g[N][N];
int gauss_solve()
{
int c, k = 0;
for (c = 0;c < n; c++) {
int t = k;
for (int i = k; i < n; i++)
if (fabs(g[i][c]) > fabs(g[t][c]))
t = i;
if (fabs(g[t][c]) < eps)
continue;
for (int i = c; i <= n; i++)
swap(g[t][i], g[k][i]);
for (int i = n; i >= c; i--)
g[k][i] /= g[k][c];
for (int i = k + 1; i < n; i++)
if (fabs(g[i][c]) > eps)
for (int j = n; j >= c; j--)
g[i][j] -= g[k][j] * g[i][c];
k++;
}
if (k < n) {
for (int i = k; i < n; i++)
if (fabs(g[i][n]) > eps)
return 2;
return 1;
}
for (int i = n - 1; i >= 0; i--)
for (int j = i + 1; j < n; j++)
g[i][n] -= g[i][j] * g[j][n];
return 0;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++)
scanf("%lf", &g[i][j]);
int t = gauss();
if (t == 2)
puts("No solution");
else if (t == 1)
puts("Infinite group solutions");
else {
for (int i = 0; i < n; i++) {
if (fabs(g[i][n]) < eps)
g[i][n] = 0;
printf("%.2lf\n", g[i][n]);
}
}
return 0;
}