题目链接:高斯消元解线性方程组
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
const double eps = 1e-8;
int n;
double a[N][N];
int gauss()
{
int c, r;
for(c = 0, r = 0; c < n; c++)
{
// 找到每列中最大值的一行
int t = r;
for(int i = r; i < n; i++)
if(fabs(a[i][c]) > fabs(a[t][c]))
t = i;
// 如果当前列中最大值是0,则寻找下一列
if(fabs(a[t][c]) < eps) continue;
// 在没有交换过的行中将最大值的那一行与当前行的数交换
for(int i = c; i <= n; i ++) swap(a[r][i], a[t][i]);
// 将最大的那一行的第一个数变成1
for(int i = n; i >= c; i --) a[r][i] /= a[r][c];
// 将该列其他行上的值变成0
for(int i = r + 1; i < n; i ++)
// 不为0才进行操作
if(fabs(a[i][c]) > eps)
for(int j = n; j >= c; j--)
a[i][j] -= a[r][j] * a[i][c];
r++;
}
for(int i = n - 1; i >= 0; i --)
for(int j = i + 1; j < n; j++)
a[i][n] -= a[i][j] * a[j][n];
if(r < n)
{
for(int i = r; i < n; i ++)
if(fabs(a[i][n]) > eps)
return 2;
return 1;
}
return 0;
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n + 1; j ++)
cin >> a[i][j];
// 0 唯一解 1 无穷多解 2 无解
int t = gauss();
if(t == 0)
{
for(int i = 0; i < n; i ++) printf("%.2lf\n", a[i][n]);
}
else if (t == 1) cout << "Infinite group solutions" << endl;
else cout << "No solution" << endl;
return 0;
}