链接:
https://www.luogu.org/problem/P3389
题意:
给定一个线性方程组,对其求解
思路:
高斯消元,从第一项消到最后一项,消成一个上三角矩阵.再从最后一项依次向上回带.
在消每一项的时候找到系数最大的一项开始消,将其系数置位1,再向下消,具体做法百度太多了.
代码:
#include <bits/stdc++.h>
using namespace std;
double Map[110][110];
double ans[110];
double eps = 1e-7;
int n;
bool Guess()
{
for (int i = 1;i <= n;i++)
{
int ml = i;
for (int j = i+1;j <= n;j++)
{
if (fabs(Map[ml][i]) < fabs(Map[j][i]))
ml = j;
}
if (fabs(Map[ml][i]) < eps)
return false;
if (ml != i)
swap(Map[ml], Map[i]);//换行
double div = Map[i][i];
for (int j = i+1;j <= n+1;j++)
Map[i][j] /= div;//讲要消的列系数变为1
for (int j = i+1;j <= n;j++)
{
div = Map[j][i];//消的值对应系数
for (int k = i;k <= n+1;k++)
Map[j][k] -= div*Map[i][k];//消元
}
}
ans[n] = Map[n][n+1];
//回带
for (int i = n-1;i >= 1;i--)
{
ans[i] = Map[i][n+1];
for (int j = i+1;j <= n;j++)
ans[i] -= (Map[i][j]*ans[j]);
}
}
int main()
{
scanf("%d", &n);
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= n+1;j++)
scanf("%lf", &Map[i][j]);
}
if (Guess())
{
for (int i = 1;i <= n;i++)
printf("%.2lf
", ans[i]);
}
else
printf("No Solution");
return 0;
}