高斯消元法(这里的好像叫约旦消元?)可以用来求线性方程组的唯一解(如果无解或有多解输出“No Solution”)。
具体方法就是一个一个变量的扫,每次处理一个变量的时候找出一个系数不为(0)的方程,用这个方程把其他方程的、这个变量的系数给消掉(具体看代码吧感觉不太能解释清楚)。然后每个变量处理完以后最后就剩那个一开始钦定的系数了,最后除一下就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 109;
const double eps = 1e-10;
int n;
double a[N][N];
void init()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n + 1; j++)
scanf("%lf", &a[i][j]);
}
void work()
{
for (int i = 1; i <= n; i++)
{
int pos = i;
for (int j = i + 1; j <= n; j++)
if (a[j][i] - a[pos][i] > eps)
pos = j;
if (fabs(a[pos][i]) < eps)
{
puts("No Solution");
return;
}
if (i != pos)
swap(a[i], a[pos]);
for (int j = 1; j <= n; j++)
{
if (j == i) continue;
double tmp = a[j][i] / a[i][i];
for (int k = 1; k <= n + 1; k++)
a[j][k] -= a[i][k] * tmp;
}
}
for (int i = 1; i <= n; i++)
printf("%.2lf
", a[i][n + 1] / a[i][i]);
}
int main()
{
init();
work();
return 0;
}