【模板】高斯消元法
2024年12月28日小于 1 分钟
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
int n;
//------------高斯消元模板-Start------------
double a[MAXN + 5][MAXN + 5];
void gauss(int x)
{
for (int i = 0; i < x; ++i)
{
int row = i;
// 接下来为了减小误差,找系数最大的一行
for (int j = i; j < x; ++j)
{
if (fabs(a[row][i]) < fabs(a[j][i]))
row = j;
}
if (row != i)
std::swap(a[row], a[i]);
double div1 = a[i][i];
for (int j = 0; j <= x; ++j)
a[i][j] /= div1;
for (int j = i + 1; j < x; ++j)
{
double div2 = a[j][i];
for (int k = 0; k <= x; ++k)
{
a[j][k] -= a[i][k] * div2;
}
}
}
for (int i = x - 1; i >= 0; i--)
{
for (int j = i - 1; j >= 0; j--)
{
a[j][x] -= a[j][i] * a[i][x];
a[j][i] = 0;
}
}
}
//------------高斯消元模板-End--------------
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 0; i <= n - 1; i++)
for (int j = 0; j <= n; j++)
cin >> a[i][j];
gauss(n);
for (int i = 0; i <= n - 1; i++)
{
bool flag = true; // 一开始认为全都是 0
for (int j = 0; j <= n - 1; j++)
if (fabs(a[i][j]) > 1e-8)
flag = false;
if (flag)
{
cout << "No Solution";
return 0;
}
}
for (int i = 0; i <= n - 1; i++)
cout << fixed << setprecision(2) << a[i][n] << "\n";
return 0;
}