思路:
没什么难的,模拟就可以
唯一需要注意的是判断无解还是无穷解,因为做完高斯的时候是一行对一个元的答案,那么如果出现一行全是0的情况就判为无穷解,但是这还不够,因为后面还有可能出现无解的情况,也就是前面全是0而答案不为0的情况,所以要扫完整个矩阵,再出答案。
复杂度O(n^3)
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int max_n = 55;
const int inf = 1e6+7;
double g[max_n][max_n];
int n;
inline int check(int x)
{
int ok=0;
for(int i=x; i<=n; ++i)
if(g[x][i]!=0)
{
ok=i;
break;
}
if(!ok)
{
if(g[x][n+1]) return 2;
else return 1;
}
else if(ok!=x) return 3;
}
inline void gauss()
{
for(int i=1; i<=n; ++i)
{
int now=i;
for(int j=i+1; j<=n; ++j)
if(fabs(g[now][i])<fabs(g[j][i]))
now=j;
for(int j=1; j<=n+1; ++j)
swap(g[now][j],g[i][j]);
if(g[i][i]==0) continue;
for(int j=i+1; j<=n+1; ++j)
g[i][j]/=g[i][i];
g[i][i]=1;
for(int j=1; j<=n; ++j)
if(j!=i)
{
for(int k=i+1; k<=n+1; ++k)
g[j][k]-=g[j][i]*g[i][k];
g[j][i]=0;
}
}
bool ok=false;
for(int i=1; i<=n; ++i)
{
int temp=check(i);
if(temp==1) ok=true;
if(temp==2)
{
printf("-1\n");
return;
}
}
if(ok)
{
printf("0\n");
return;
}
for(int i=1; i<=n; ++i)
{
if(g[i][n+1]==0)
printf("x%d=0\n",i);
else
printf("x%d=%.2lf\n",i,g[i][n+1]);
}
}
int main()
{
freopen("gaess.in","r",stdin);
freopen("gaess.out","w",stdout);
scanf("%d",&n);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n+1; ++j)
scanf("%lf",&g[i][j]);
gauss();
return 0;
}