#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
double A[1010][1010];
double B[1010];
double X[1010];
void rowswap(int x,int y,int n) //第x行与第y行交换;
{
for(int i=1; i<=n; i++)
{
swap(A[x][i],A[y][i]);
}
swap(B[x],B[y]);
}
void qmax(int x,int n)
{
double tmp=A[x][x];
int pos=x;
for(int i=x+1; i<=n; i++)
{
if(A[i][x]>tmp)
{
pos=i;
tmp=A[i][x];
}
}
if(pos!=x)
{
rowswap(x,pos,n);
}
}
int main()
{
int n;
double tmp;
printf("请输入系数矩阵的阶数:\n");
while(~scanf("%d",&n))
{
printf("请输入矩阵元素:同行以空格隔开,同列以回车隔开\n");
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%lf",&A[i][j]);
}
}
printf("请输入B向量,个元素以空格隔开:\n");
for(int i=1; i<=n; i++)
{
scanf("%lf",&B[i]);
}
for(int i=1; i<n; i++)
{
qmax(i,n);
for(int j=i+1; j<=n; j++)
{
tmp=A[j][i]/A[i][i];
for(int k=i; k<=n; k++)
{
A[j][k]-=A[i][k]*tmp;
}
B[j]-=B[i]*tmp;
}
}
for(int i=n; i>=1; i--)
{
for(int j=n; j>i; j--)
{
B[i]-=A[i][j]*X[j];
}
X[i]=B[i]/A[i][i];
}
printf("输出解向量为:\n");
for(int i=1; i<=n; i++) //输出;
{
printf("%.4f\n",X[i]);
}
}
return 0;
}