#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int n;
float** Initarry()
{
int i,j;
float **a;
a=(float **)malloc((n+1)*sizeof(float*));
for(i=0;i<=n;i++)
a[i]=(float *)malloc((n+2)*sizeof(float));
for(i=0;i<=n;i++)
for(j=0;j<=n+1;j++)
a[i][j]=0;
return a;
}
void print(float **p)
{
int i,j;
printf("---------------------------------/n");
for(i=1;i<=n;i++){
for(j=1;j<=n+1;j++)
printf("%f ",p[i][j]);
printf(" ");
}
printf("/n---------------------------------/n");
}
void scanarry(float **p)
{
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n+1;j++)
scanf("%f",&p[i][j]);
}
}
void work1(float **a)
{
int i,j,k;
float D,sum=0;
D=1;
for(k=1;k<=n-1;k++){
if(a[k][k]==0)
exit(1);
for(i=k+1;i<=n;i++){
a[i][k]/=a[k][k];//计算l[i][k]
for(j=k+1;j<=n+1;j++)
a[i][j]-=(a[i][k]*a[k][j]);//消元
}
//print(a);
D*=a[k][k];
if(a[n][n]==0)
exit(1);
else
D*=a[n][n];
}
for(k=n;k>=1;k--){
if(k!=n)
for(j=k+1;j<=n;j++)
sum+=a[k][j]*a[j][n+1];
else
sum=0;
a[k][n+1]=(a[k][n+1]-sum)/a[k][k];//求X[k]
sum=0;
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
float **p;
int i,j;
printf("请输入线性方程组的阶 ");
scanf("%d",&n);
p=Initarry();
printf("请输入线性方程组的矩阵形式 /n");
scanarry(p);
//读入矩阵
//print(p);
work1(p);
//print(p);
for(i=1;i<=n;i++)
printf("X[%d]= %f/n",i,p[i][n+1]);
return 0;
}