#include<bits/stdc++.h>
#define re register int
#define D double
using namespace std;
int n,J;
D a[600][600],x[600];
void solve()
{
int h=1,l=1;
for(;(h<=n)&&(l<=n);h++,l++)
{
int maxx=h;
for(re j=h+1;j<=n;j++)
if(fabs(a[j][l])>fabs(a[maxx][l]))
maxx=j;
if(maxx!=h)
swap(a[h],a[maxx]);
if(!a[h][l])
{
--h;
continue;
}
for(re j=h+1;j<=n;j++)
{
D tem=a[j][l]/a[h][l];
for(re k=l;k<=n+1;k++)
a[j][k]-=a[h][k]*tem;
}
}
for(re i=h;i<=n;i++)
if(a[i][n+1]!=0)
{
J=-1;
return;
}
if(h<=n)
J=-2;
}
int main()
{
scanf("%d",&n);
for(re i=1;i<=n;i++)
for(re j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
solve();
if(J==-1)
{
printf("-1\n");
return 0;
}
if(J==-2)
{
printf("0\n");
return 0;
}
for(re i=n;i>0;i--)
{
D ans=a[i][n+1];
for(re j=n;j>i;j--)
ans-=a[i][j]*x[j];
x[i]=ans/a[i][i];
}
for(re i=1;i<=n;i++)
{
if(x[i]==0)
printf("x%d=0\n",i);
else
printf("x%d=%.2lf\n",i,x[i]);
}
return 0;
}
2.相对简单,但不能判断无解
#include<bits/stdc++.h>
#define re register int
#define D double
using namespace std;
int n,J;
D a[600][600];
void solve()
{
for(re i=1;i<=n;i++)
{
int maxx=i;
for(re j=i+1;j<=n;j++)
{
if(fabs(a[j][i])>fabs(a[maxx][i]))
maxx=j;
}
if(maxx!=i)
swap(a[i],a[maxx]);
for(re j=1;j<=n;j++)
{
if(j==i)
continue;
D tem;
if(!a[i][i])
tem=0;
else
tem=a[j][i]/a[i][i];
for(re k=i+1;k<=n+1;k++)
a[j][k]-=a[i][k]*tem;
}
}
}
int main()
{
scanf("%d",&n);
for(re i=1;i<=n;i++)
for(re j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
solve();
for(re i=1;i<=n;i++)
{
D ans=a[i][n+1]/a[i][i];
if(ans==0)
printf("x%d=0\n",i);
else
printf("x%d=%.2lf\n",i,ans);
}
return 0;
}