/约旦消元法大致思路如下:
1.选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。
2.将这个方程主元的系数化为1。
3.通过加减消元,消掉其它方程中的这个未知数。
4.重复以上步骤/
include<bits/stdc++.h>
define rep(i,a,b) for(int i=a;i<=b;++i)
define dwn(i,a,b) for(int i=a;i>=b;--i)
define X (c^48)
define C c=getchar()
define ee(i,x) for(int i=head[x];i;i=e[i].next)
template void inline rd(T&x){char c;int f=1;while(!isdigit(C))if(c=='-')f=-1;x=X;while(isdigit(C))x=x10+X;x=f;}
define debug printf("Now is %d\n",LINE);
using namespace std;
define N 105
double a[N][N];
int n;
int main()
{
freopen("read.txt","r",stdin);
rd(n);
rep(i,1,n)
rep(j,1,n+1)
rd(a[i][j]);
rep(i,1,n)//枚举列
{
int max=i;
rep(j,i+1,n)//选出该列最大系数
if(fabs(a[j][i])>fabs(a[max][i]))//fabs是取浮点数的绝对值的函数
max=j;
int max=i;
rep(j,i+1,n)
if(fabs(a[j][i])>fabs(a[max][i]))
max=j;
rep(k,1,n+1)
swap(a[max][k],a[i][k]);
if(!a[i][i])//最大值等于0则说明该列都为0,肯定无解||有无数种解
{
puts("No Solution");
return 0;
}
rep(j,1,n)//每一项都减去一个数(小学加减消元)
{
if(j!=i)
{
double temp=a[j][i]/a[i][i];
rep(k,i+1,n+1)
a[j][k]-=a[i][k]*temp;
}
}
}
//上述操作结束后,矩阵会变成这样
/*
k1*a=e1
k2*b=e2
k3*c=e3
k4*d=e4
e.g.
2 0 0 2
0 3/2 0 -2
0 0 2/3 2
*/
//所以输出的结果要记得除以该项系数,消去常数
rep(i,1,n)
printf("%.2lf\n",a[i][n+1]/a[i][i]);
return 0;
}