#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int solve(int a[20][20],int n);
void clears(int b[20][20],int i,int j,int n);
void change(int c[20][20],int b[20],int k,int n);
int main()
{
int i,j,x,y;
int a[20][20];
int e[20];
cout<<"解n元一次方程组,首先输入n:"<<endl;
int n;
cin>>n;
cout<<"输入"<<n<<"行,每行包含"
<<n<<"个数字,用来表示x1,x2...xn的系数值:"<<endl;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cin>>*(*(a+i)+j);
cout<<"输入"
<<n<<"个数字,用来表示b1,b2...bn解的常数值:"<<endl;
for(i=0; i<n; i++)
cin>>e[i];
/*下面来求解Di*/
int D=solve(a,n);
int d[20];
for(i=0; i<n; i++)
{
/*先置换a数组中第i+1列的值,即第二维下标为i*/
int c[20][20];
for(x=0; x<n; x++)
for(j=0; j<n; j++)
*(*(c+x)+j)=*(*(a+x)+j);
change(c,e,i,n);
d[i]=solve(c,n);
}
for(i=0; i<n; i++)
cout<<"X"<<i+1<<"="<<d[i]/D<<endl;
return 0;
}
void change(int c[20][20],int b[20],int k,int n)
{
/*c数组的第k+1列改变,行坐标循环*/
int x;
for(x=0; x<n; x++)
c[x][k]=b[x];
}
int solve(int a[20][20],int n)
{
int sum=0,j,i,x,y;
int b[20][20];
if(n==2)
return a[0][0]*a[1][1]-a[0][1]*a[1][0];
else
{
for(i=0; i<n; i++)
for(j=0; j<n; j++)
*(*(b+i)+j)=*(*(a+i)+j); /*b数组的初始化*/
i=0;
for(j=0; j<n; j++)
{
clears(b,i+1,j+1,n);/*第i行,第j列*/
sum+=pow(-1,i+j)*solve(b,n-1)*a[i][j];
for(x=0; x<n; x++)
for(y=0; y<n; y++)
*(*(b+x)+y)=*(*(a+x)+y);
}
return sum;
}
}
void clears(int b[20][20],int i,int j,int n)
{
/*先消除第i行,列不变*/
int x,y;
for(x=i-1; x<n; x++)
for(y=0; y<n; y++)
b[x][y]=b[x+1][y];
/*再消除第j列,行不变*/
for(y=j-1; y<n; y++)
for(x=0; x<n; x++)
b[x][y]=b[x][y+1];
}