#include <stdio.h>
#include <math.h>
void main()
{
int i,j,k,n,l,h,flag;
float a[100][100],b[100],m[100][100],x[100],y[100],z[100],c[100],d,t;
printf("Input n:\n");
scanf("%d",&n);
printf("input a[i][j]:\n");
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf("%f",&a[i][j]);
}
}
printf("input b[i]:\n");
for (i=0;i<n;i++)
{
scanf("%f",&b[i]);
}
/*******运算过程*******/
flag=1;
for (k=0;k<n;k++)
{
/*---选主元素---*/
d=a[k][k];
h=k;
for(l=k;l<n;l++)
{
if(fabs(a[l][k])>fabs(d))
{
d=a[l][k];
h=l;
}
}
if(h!=k)
{
for(j=k;j<n;j++)
{
t=a[h][j];a[h][j]=a[k][j];a[k][j]=t;
}
t=b[k];b[k]=b[h];b[h]=t;
}
if(a[k][k]==0)
flag=0;
/*---具体运算---*/
for (i=k+1;i<n;i++)
{
if(flag==0)
break;
m[i][k]=a[i][k]/a[k][k];
for(j=k;j<n;j++)
{
a[i][j]=a[i][j]-m[i][k]*a[k][j];
}
b[i]=b[i]-m[i][k]*b[k];
}
}
/*******回代过程*******/
if(flag!=0)
{
x[n-1]=b[n-1]/a[n-1][n-1];
for(i=n-2;(i>0)||(i==0);i--)
{
y[i]=0;
for(j=i+1;j<n;j++)
{
y[j]=y[j-1]+a[i][j]*x[j];
}
x[i]=(b[i]-y[j-1])/a[i][i];
}
/*******输出结果*******/
for(i=0;i<n;i++)
{
printf("x[%d]=%f\n",i,x[i]);
}
}
else
printf("oh my god!\n");
}