#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int n;
bool needDebug;
double m[1005][1005]={0};
double x[1005]={0};
void input()
{
printf("请输入系数矩阵的阶数(1~1000)\n");
scanf("%d",&n);
printf("请按行优先顺序输入增广矩阵(用空格、缩进或回车分割每个数字)\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&m[i][j]);
printf("是否输出中间过程的增广矩阵?是请输入y\n");
char cc[2];
scanf("%s",cc);
if(cc[0]=='y') needDebug=1;
else needDebug=0;
}
void debug()
{
if(!needDebug) return;
printf("**********************\n");
for(int i=1;i<=n;i++,printf("\n"))
for(int j=1;j<=n+1;j++)
printf("%24.20lf",m[i][j]);
printf("**********************\n");
}
inline void rowSwap(int i,int j)
{
for(int k=1;k<=n+1;k++) std::swap(m[i][k],m[j][k]);
}
int select(int i)
{
int mxrow=i;
for(int k=i+1;k<=n;k++)
{
if(m[k][i]>m[i][i])
mxrow=k;
}
rowSwap(i,mxrow);
if(fabs(m[i][i])<1e-10)
{
printf("无唯一解\n");
return 0;
}
return 1;
}
int inline gauss()
{
for(int i=1;i<=n;i++)
{
if(!select(i)) return 0;
for(int j=i+1;j<=n;j++)
{
if(fabs(m[j][i])<1e-10) continue;
double k=m[j][i]/m[i][i];
for(int h=i;h<=n+1;h++)
{
m[j][h]-=m[i][h]*k;
}
debug();
}
}
for(int i=n;i;i--)
{
x[i]=m[i][n+1]/m[i][i];
for(int j=i-1;j;j--)
{
m[j][n+1]-=x[i]*m[j][i];
m[j][i]=0;
}
}
return 1;
}
void output()
{
for(int i=1;i<=n;i++) printf("x_{%d}\t=\t%.2lf\n",i,x[i]);
}
int main()
{
//freopen("test.in","r",stdin);
while(1)
{
input();
if(gauss())
output();
puts("退出请点击右上角X");
}
return 0;
}